如何使用使用多个参数的 url-pattern 在 django 中制作唯一的 urls?
How to make unique urls in django with url-pattern that uses multiple parameters?
我的 url 结构是这样的:
示例。com/category/subcategory/name
现在我正在使用 DetailView,它会在我编写它时检测到 url,但它会积极解析任何包含正确名称的地址,因为该名称是唯一的,所以我需要检查的是该名称对应于子类别,该子类别对应于主类别。
例如我想要的url是:
http://example.com/animal/cat/garfield
使用 200 代码解析正常。
但是,当我写:
http://example.com/insect/cat/garfield
它也解析为 200 而不是 404。
如何在我的视图中检查这些参数?
我的urls.py
path('<str:category>/<str:subcategory>/<str:slug>', views.AnimalDetailView.as_view(), name="animal_detail")
我的看法:
class AnimalDetailView(DetailView):
model = Animal
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['now'] = timezone.now()
return context
我认为你的 URL 应该以 /
结尾。参考 https://docs.djangoproject.com/en/2.1/topics/http/urls/
path('<str:category>/<str:subcategory>/<str:slug>/', views.AnimalDetailView.as_view(), name="animal_detail").
通过 URL 传递的所有参数都将使用 kwargs。如果你想在你的视图中访问参数,你可以使用以下方法
1)
class Test(DetailView):
def get(self, request, **kwargs):
subcategory = kwargs['subcategory']
category = kwargs['category']
2)
class Test(DetailView):
def get(self, request, category, subcategory, .. ):
# category contains value of category
第一种方法是首选方法。
你可以做的是,在 get_object
方法中,通过覆盖它来约束自己。例如:
class AnimalDetailView(DetailView):
...
def get_object(self):
category = self.kwargs.get('category')
subcategory = self.kwargs.get('subcategory')
slug = self.kwargs.get('slug')
animal = Animal.objects.filter(category=category, subcategory=subcategory, slug=slug)
if animal.exists():
return super(AnimalDetailView, self).get_object()
else:
Http404("Animal not found")
我的 url 结构是这样的:
示例。com/category/subcategory/name
现在我正在使用 DetailView,它会在我编写它时检测到 url,但它会积极解析任何包含正确名称的地址,因为该名称是唯一的,所以我需要检查的是该名称对应于子类别,该子类别对应于主类别。
例如我想要的url是:
http://example.com/animal/cat/garfield
使用 200 代码解析正常。 但是,当我写:
http://example.com/insect/cat/garfield
它也解析为 200 而不是 404。
如何在我的视图中检查这些参数?
我的urls.py
path('<str:category>/<str:subcategory>/<str:slug>', views.AnimalDetailView.as_view(), name="animal_detail")
我的看法:
class AnimalDetailView(DetailView):
model = Animal
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['now'] = timezone.now()
return context
我认为你的 URL 应该以 /
结尾。参考 https://docs.djangoproject.com/en/2.1/topics/http/urls/
path('<str:category>/<str:subcategory>/<str:slug>/', views.AnimalDetailView.as_view(), name="animal_detail").
通过 URL 传递的所有参数都将使用 kwargs。如果你想在你的视图中访问参数,你可以使用以下方法 1)
class Test(DetailView):
def get(self, request, **kwargs):
subcategory = kwargs['subcategory']
category = kwargs['category']
2)
class Test(DetailView):
def get(self, request, category, subcategory, .. ):
# category contains value of category
第一种方法是首选方法。
你可以做的是,在 get_object
方法中,通过覆盖它来约束自己。例如:
class AnimalDetailView(DetailView):
...
def get_object(self):
category = self.kwargs.get('category')
subcategory = self.kwargs.get('subcategory')
slug = self.kwargs.get('slug')
animal = Animal.objects.filter(category=category, subcategory=subcategory, slug=slug)
if animal.exists():
return super(AnimalDetailView, self).get_object()
else:
Http404("Animal not found")