【问题标题】:Django default arguments in URLURL中的Django默认参数
【发布时间】: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 作为默认值

标签: django url


【解决方案1】:

使用 regexdjango.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

相关参考:

【讨论】:

    【解决方案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')
    

    【讨论】:

      猜你喜欢
      • 2013-12-17
      • 2014-04-12
      • 2010-09-19
      • 1970-01-01
      • 1970-01-01
      • 2013-02-20
      • 2019-11-10
      • 2013-12-23
      • 1970-01-01
      相关资源
      最近更新 更多