如何重写 url 以在视图中获取 slug

How to rewrite urls to get slug in view

Django 3.0.7

urls.py

urlpatterns = [
    path('<slug:categories>/', include(('categories.urls', "categories"), namespace="categories")),
]

categories/urls.py

urlpatterns = [
    path('', CategoryView.as_view(), name='list'),
]

views.py

class CategoryView(ListView):

    model = Post

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context["object_list"] = context["object_list"].filter(category__slug="linux") # Hardcoded so far
        return context

    def get_template_names(self):
        return ["categories/post_list.html"]

然后我请求http://localhost:8000/linux/

问题

在到达的请求中kwargs为空。

为什么会发生这种情况,我该如何应对?

使用 self.kwargs['categories'] 从 URL.

获取 slug 值
class CategoryView(ListView):
    model = Post

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context["object_list"] = context["object_list"].filter(category__slug=<b>self.kwargs['categories']</b>)
        return context

    def get_template_names(self):
        return ["categories/post_list.html"]



但是,如果我有选择的话,我会重写 get_queryset(...) 方法而不是 get_context_data(...),在这种情况下这是更 Django 的方式

class CategoryView(ListView):
    model = Post

    <b>def get_queryset(self):
        return super().get_queryset().filter(category__slug=self.kwargs['categories'])</b>

    def get_template_names(self):
        return ["categories/post_list.html"]