将 slug 传递到 ListView URL

Passing slug into ListView URL

我想将 slug 传递给 ListView。但这并不像传递给DetailView那么简单。

那是因为 ListView 没有内置的 slug 支持。

我找到了问题的答案,想与大家分享。

注意:我使用 ManyToMany 字段。

Models.py:

class Article(models.Model):
    ...
    country = models.ManyToManyField('Country', related_name='country', blank=True)
    ...

class Country(models.Model):
    name = models.CharField(max_length=50)
    slug = models.SlugField(unique=True)

urls.py:

urlpatterns = [
    path('<country>/', ArticlesListView.as_view(), name='articles-list'),
]

views.py:

from django.shortcuts import get_list_or_404
class ArticlesListView(ListView):
    model = Article
    template_name = 'articles/articles-list.html'


    def get_queryset(self, *args, **kwargs):
        return get_list_or_404(Article.objects.all().filter(topic__slug = self.kwargs['topic']))

参考资料link: https://docs.djangoproject.com/en/3.1/topics/class-based-views/generic-display/#dynamic-filtering