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默认参数的主要内容,如果未能解决你的问题,请参考以下文章

django URL的补充 默认值 传多个参数

django-URL默认参数传递

带有 URL 参数的 Django 模板检查值

怎样设置django默认的url

Django路由系统(一)

Django url (路由)