首页 > 解决方案 > 如何使用使用多个参数的 url-pattern 在 django 中创建唯一的 url?

问题描述

我的网址是这样构成的:

example.com/category/subcategory/name

现在我正在使用 DetailView 并在我编写它时检测到 url 但它会积极解析为包含正确名称的任何地址,因为该名称是唯一的,所以我需要检查的是该名称是否对应于子类别并且这个子类别对应于主要类别。

例如我想要的网址是:

http://example.com/animal/cat/garfield

它可以用 200 代码解决。但是,当我写:

http://example.com/insect/cat/garfield

它也解析为 200 而不是 404。

如何在我的视图中检查这些参数?

我的网址.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

标签: djangourl-pattern

解决方案


我认为您的 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

第一种方法是首选方法。


推荐阅读