如何在 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
我想要解决 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