我在ListView上遇到问题,无法从类型电影中获取queryset。如果我转到类别,则可以看到电影类别,但是如果要按流派观看电影,则会看到一个空列表。
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"),
]
答案 0 :(得分:1)
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
上进行过滤,则前缀可以使您清楚。您当然可以用其他方式进行区分。但最重要的是,模式不应重叠。