如何在 Django 中使用可选参数 URL

How to use an optional parameter in django URL

我想要解决 Django URL 在没有任何可选参数或有可选参数的情况下如何工作的解决方案。

这是我想要的 URL 结构:

path('<slug:category_slug>-comparison/<slug:brand_slug1>-vs-<slug:brand_slug2>-vs-<slug:brand_slug3>/',views.compare_brand)

现在我想要像第一个两个 slug 这样的东西来比较是强制性的,所以,按照上面的 URL

path('<slug:category_slug>-comparison/<slug:brand_slug1>-vs-<slug:brand_slug2>',views.compare_brand)

这工作正常,因为这是强制性的 url 参数,但我想将可选的 url 从第二个 'vs' 传递到 brand_slug3。

谁能帮我解决这个问题?

你不能在 django 中这样做 urls.py。但是您可以将 URL 查询字符串传递给视图。例如,如果您点击 url:

http://localhost:8000/Category1-comparison/Brand1-vs-Brand2/?vs=Brand3

然后您可以从 request.GET 中捕获 Brand3 值。像这样:

def compare_brand(request, category_slug, brand_slug1, brand_slug2):
     brand_slug3 = request.GET.get('vs')

更好的解决方案:

也许更好的方法是一起使用 URL 查询字符串。因为,那样 url 会更干净。例如:

# url

path('/comparison/<slug:category_slug>/', compare_brand)

# view
def compare_brand(request, category_slug):
    brands = request.GET.getlist('brands')
    if len(brands) < 2:
        raise Exception('Need 2 brands atleast')

# browser url
http://localhost:8000/comparison/Cat1/?brands=Brand1,Brand2

来自评论

您可以创建另一个 url 指向同一视图

# url
path('<slug:category_slug>-comparison/<slug:brand_slug1>-vs-<slug:brand_slug2>-vs-<slug:brand_slug3>/',views.compare_brand),
path('<slug:category_slug>-comparison/<slug:brand_slug1>-vs-<slug:brand_slug2>/',views.compare_brand)

# view

def compare_brand(request, category_slug, brand_slug1, brand_slug2, brand_slug3=None):
    if brand_slug3:
       # do something