URL中的Django默认参数
Posted
技术标签:
【中文标题】URL中的Django默认参数【英文标题】:Django default arguments in URL 【发布时间】:2021-10-09 07:07:21 【问题描述】:我有一个如下所示的 url 路径:
path("asset_app/asset/<str:location>/", views.AssetListView.as_view(), name="asset_app_asset_list"),
如果没有设置位置,我希望它设置
location = "all"
我该怎么做?
【问题讨论】:
我认为只有一个 url 是不可能的。您必须为asset_app/asset/
创建另一个 url,但使用相同的视图。然后在您看来,将location
kwarg 设为可选,all
作为默认值
查看***.com/a/20318971/8401179
【参考方案1】:
使用 regex 和 django.urls.re_path 来捕获 URL 中的可选字段 location
。然后,在视图中定义其默认值。
urls.py
from django.urls import re_path
from my_app.views import get_asset
urlpatterns = [
re_path(r"asset_app/asset/(?P<location>\w+)?", get_asset),
]
views.py
from django.http import HttpResponse
def get_asset(request, location="all"):
print(f"location=")
return HttpResponse(location)
输出:
$ curl http://127.0.0.1:8000/asset_app/asset/
all
$ curl http://127.0.0.1:8000/asset_app/asset/whatever
whatever
$ curl http://127.0.0.1:8000/asset_app/asset/wherever/
wherever
日志:
location='all'
[04/Aug/2021 07:40:27] "GET /asset_app/asset/ HTTP/1.1" 200 3
location='whatever'
[04/Aug/2021 07:40:40] "GET /asset_app/asset/whatever HTTP/1.1" 200 8
location='wherever'
[04/Aug/2021 07:42:00] "GET /asset_app/asset/wherever/ HTTP/1.1" 200 8
相关参考:
Django optional url parameters【讨论】:
【参考方案2】:在这种情况下,如@bdbd 所建议的那样,您必须使用 2 个 url 模式,一个带有 location 参数,另一个没有它,这将指向相同的视图,如下所示:
path("asset/<str:location>/", views.AssetListView.as_view(),name="asset_app_asset_list"),
path("asset/", views.AssetListView.as_view(),name="asset_app_asset_withoutlist"),
在您的 CBV 中,如果未在 url 中作为参数传递,您可以通过 kwargs 上的 get 方法访问位置,默认值为 'all':
location = self.kwargs.get('location','all')
【讨论】:
以上是关于URL中的Django默认参数的主要内容,如果未能解决你的问题,请参考以下文章