如何重写 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"]
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.
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"]