如何使用使用多个参数的 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")