path(r'category/<slug:title>/', (views.CategorysTagView.as_view(), name='category'),
上述URL中的title可以默认为空吗,例如可传可不传!
path(r'category/<slug:title>/', (views.CategorysTagView.as_view(), name='category'),
上述URL中的title可以默认为空吗,例如可传可不传!
你题目中描述的方式, title
不能为空,否则路由无法匹配。
如果你想让这个参数可选, 那你可以再多声明一个路由,把你要不选的部分给省略掉, 然后视图函数那里的参数默认为 None
。
比如:
# urls.py
urlpatterns = [
path("category/", views.CategoryTagView.as_view(), name="category"),
re_path(r"^category/(?P<title>[\w-]+)/", views.CategoryTagView.as_view(), name="category"),
]
# views.py
class CategoryTagView(View):
@staticmethod
def get(request: HttpRequest, title: Optional[str] = None):
if title:
return HttpResponse(f"Received title: {title}")
return HttpResponse("Received title: None")
curl http://127.0.0.1:8000/category/
## Received title: None
curl http://127.0.0.1:8000/category/ab-c-d/
## Received title: ab-c-d
15 回答8.2k 阅读
4 回答4.5k 阅读✓ 已解决
1 回答3.2k 阅读✓ 已解决
4 回答4k 阅读
4 回答3.8k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
2 回答1.6k 阅读✓ 已解决
不可以。
来自:https://docs.djangoproject.com/zh-hans/4.2/topics/http/urls/#...
更新 1:
如果像这样一个路径:
url/<arg1>/<arg2>/
,如果参数可以为空的话,那么有以下四种情况:<arg2>
为空的话,那么 url 就是url/<arg1>/
,(经过测试,多个连续的斜杠会被视为一个);<arg1>
为空的话,那么 url 就是url/<arg2>/
;<arg1>
和<arg2>
都为空,那么 url 就是url/
。<arg1>
和<arg2>
都不为空,那么 url 就是url/<arg1>/<arg2>/
。对于这四种情况,你每个都需要声明一个路由:
但是 Django 在遇到请求时按顺序遍历每个 URL 模式,然后会在所请求的URL匹配到第一个模式后停止(文档),所以按照上面的定义,第二种情况永远不会触发,而如果交换一下,那么第一种情况不会触发。
当然,如果你能很方便的区分开传入视图的参数是
arg1
还是arg2
,第一二种情况你可以合并为一条路由path("url/<arg>/", views.args)
,然后在视图函数中这样写:其中
arg1_list
和arg2_list
分别是arg1
和arg2
的所有可能的值的列表。