首页 > 解决方案 > 如何解决 django 2.2 上的 ListView 问题

问题描述

我对 ListView 有疑问,无法从流派电影中获取查询集。如果我转到类别,我可以看到电影类别,但如果我想按类型查看电影,我会看到一个空列表。

views.py

class MovieListView(ListView):
    context_object_name = 'movies'

    def get_queryset(self):
        if self.kwargs.get('category') is not None:
            movie_list = Movie.objects.filter(
                category__slug=self.kwargs.get('category'),
                published=True,
            )
            movies = movie_list
        elif self.kwargs.get('genre') is not None:
            movie_list = Movie.objects.filter(
                genre__slug=self.kwargs.get('genre'),
                published=True,
            )
            movies = movie_list
        else:
            movies = Movie.objects.filter(published=True)
        return movies


urls.py

app_name = "movies"

urlpatterns = [
    path('', MovieListView.as_view(), name='movie_list'),
    path('<id>-<name>/', MovieDetailView.as_view(), name='movie_detail'),
    path("<slug:category>/", MovieListView.as_view(), name="category_post"),
    path("<slug:genre>/", MovieListView.as_view(), name="genre_list"),
]

标签: django

解决方案


urls.py没有多大意义。匹配模式的模式与匹配的'<slug:category>/'模式完全相同'<slug:genre>/'。所以它总是在这里走第一条路。

因此,您应该使路径不同,例如通过前缀:

urlpatterns = [
    path('', MovieListView.as_view(), name='movie_list'),
    path('<id>-<name>/', MovieDetailView.as_view(), name='movie_detail'),
    path('category/<slug:category>/', MovieListView.as_view(), name='category_post'),
    path('genre/<slug:genre>/', MovieListView.as_view(), name='genre_list'),
]

category现在,如果您在过滤上或上过滤,前缀将变得清晰genre。你当然可以用不同的方式进行区分。但最重要的是模式不应重叠。


推荐阅读