Django有没有一种更简单的方法来使用DRY显示电影类型页面

2024-04-24 03:36:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我用django2.1创建了一个电影网站,我有一些类型的管理顶部,最新,惊悚,恐怖,动作等页面。。。这很好,但我还有另外10+种风格和10+年要做,我想一定有更好的方式,干的方式,然后有单独的页面时,页面布局是一样的等等,只是内容的变化,就像在我的细节视图。。我有谷歌,搜索等我似乎搞不懂。感谢任何帮助

这是我的观点

from django.shortcuts import render, get_object_or_404
from .models import Movie, Banner
from django.views.generic import ListView, DetailView



# Base page for pages.
def base(request):
    return render(request, 'movies/base.html')



# HOME-PAGE
class HomeListView(ListView):
    model = Movie
    template_name = 'movies/home.html' # <app>/<model>_<viewtype>.html

    def get_context_data(self, **kwargs):
        context = super(HomeListView, self).get_context_data(**kwargs)
        context['admin_movies'] = Movie.objects.filter(admin_top__contains='Yes').order_by('-date_posted')
        context['latest_movies'] = Movie.objects.all().order_by('-date_posted')
        context['thriller_movies'] = Movie.objects.filter(genre__contains='Thriller').order_by('-date_posted')
        context['horror_movies'] = Movie.objects.filter(genre__contains='Horror').order_by('-date_posted')
        context['action_movies'] = Movie.objects.filter(genre__contains='Action').order_by('-date_posted')
        # Add any other variables to the context here
        return context



# MOVIE DETAIL PAGE
class MovieDetailView(DetailView):
    model = Movie
    queryset = Movie.objects.all()
    template_name = 'movies/movie-detail.html'

    def get_object(self):
        title_ = self.kwargs.get('title')
        return get_object_or_404(Movie, title=title_)



# ADMIN MOVIE-PAGE
class AdminListView(ListView):
    model = Movie
    queryset = Movie.objects.filter(admin_top__contains='Yes')
    template_name = 'movies/admin-top.html' 
    context_object_name = 'admin_movies'
    ordering = ['-date_posted']
    paginate_by = 2




# LATEST MOVIE-PAGE
class LatestListView(ListView):
    model = Movie
    template_name = 'movies/latest.html' 
    context_object_name = 'latest_movies'
    ordering = ['-date_posted']



# THRILLER MOVIE-PAGE
class ThrillerListView(ListView):
    model = Movie
    queryset = Movie.objects.filter(genre__contains='Thriller')
    template_name = 'movies/thriller.html' 
    context_object_name = 'thriller_movies'
    ordering = ['-date_posted']



# ACTION MOVIE-PAGE
class ActionListView(ListView):
    model = Movie
    queryset = Movie.objects.filter(genre__contains='Action')
    template_name = 'movies/action.html' 
    context_object_name = 'action_movies'
    ordering = ['-date_posted']



# HORROR MOVIE-PAGE
class HorrorListView(ListView):
    model = Movie
    queryset = Movie.objects.filter(genre__contains='Horror') # only for filter/query on field - no more at time with using this
    template_name = 'movies/horror.html' 
    context_object_name = 'horror_movies'

    ordering = ['-date_posted','genre']

这是我的模型

从django.db公司导入模型

^{pr2}$

这是我的网址

from django.urls import path
from .models import Movie
from .views import (
    HomeListView,
    MovieDetailView,
    AdminListView,
    LatestListView,
    ThrillerListView,
    HorrorListView,
    HomeListView,
    ActionListView,
    base
    )

urlpatterns = [
    path('', HomeListView.as_view(), name='movie-home'),
    path('movie-detail/<title>/', MovieDetailView.as_view(), name='movie-detail'),
    path('admin-top/', AdminListView.as_view(), name='movie-admin'),
    path('latest/', LatestListView.as_view(), name='movie-latest'),
    path('thriller/', ThrillerListView.as_view(), name='movie-thriller'),
    path('horror/', HorrorListView.as_view(), name='movie-horror'),
    path('action/', ActionListView.as_view(), name='movie-action'),
    path('base/', base, name='movie-base'),
]

Tags: pathnamedatemodelobjectsobjecthtmlcontext
2条回答

根本不需要单独的观点。URL应该捕获genre关键字,然后您的视图在get queryset方法中使用它来获取相关的电影。在

path("<str:genre>", GenreListView ...)

。。。在

^{pr2}$

创建一个名为GenreListView的类,它是ListView的子类。让所有其他类型页面子类GenreListView。将所有常见的逻辑/成员变量作为GenreListView的一部分,而不是将它们放入从中继承的类中。例如,它们都使用model = Movie,因此将其设置为GenreListView。在

如果您对Python-OOP非常熟悉,那么您可以将这一点带到一个逻辑的极端,并考虑出许多可能不像model = Movie那么明显的事情。例如,您可以在超类上创建一个存根方法(例如,称为get_qs_filter()),该超类返回一个在形成查询集时使用的过滤器。存根本身不做任何事情,而是由它继承的类实现该方法。但是超类仍然可以调用get_qs_filter(),将其传递给Movie.objects.filter,并将其设置为queryset成员变量。在

相关问题 更多 >