path(r'category/<slug:title>/', (views.CategorysTagView.as_view(), name='category'),
上述URL中的title可以默认为空吗,例如可传可不传!
你题目中描述的方式, title
不能为空,否则路由无法匹配。
如果你想让这个参数可选, 那你可以再多声明一个路由,把你要不选的部分给省略掉, 然后视图函数那里的参数默认为 None
。
比如:
# urls.pyurlpatterns = [ path("category/", views.CategoryTagView.as_view(), name="category"), re_path(r"^category/(?P<title>[\w-]+)/", views.CategoryTagView.as_view(), name="category"),]# views.pyclass 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: Nonecurl http://127.0.0.1:8000/category/ab-c-d/## Received title: ab-c-d
不可以。
str
- 匹配除了'/'
之外的 非空字符串。如果表达式内不包含转换器,则会默认匹配字符串。
来自:https://docs.djangoproject.com/zh-hans/4.2/topics/http/urls/#...
更新 1:
查看示例仓库: https://jihulab.com/zhoushengdao-sf/django-route
如果像这样一个路径:url/<arg1>/<arg2>/
,如果参数可以为空的话,那么有以下四种情况:
<arg2>
为空的话,那么 url 就是 url/<arg1>/
,(经过测试,多个连续的斜杠会被视为一个);<arg1>
为空的话,那么 url 就是 url/<arg2>/
;<arg1>
和 <arg2>
都为空,那么 url 就是 url/
。<arg1>
和 <arg2>
都不为空,那么 url 就是 url/<arg1>/<arg2>/
。对于这四种情况,你每个都需要声明一个路由:
urlpatterns = [ path("url/<arg1>/", views.args), # 第一种情况 path("url/<arg2>/", views.args), # 第二种情况 path("url/", views.args), # 第三种情况 path("url/<arg1>/<arg2>/", views.args) # 第四种情况]
但是 Django 在遇到请求时按顺序遍历每个 URL 模式,然后会在所请求的URL匹配到第一个模式后停止(文档),所以按照上面的定义,第二种情况永远不会触发,而如果交换一下,那么第一种情况不会触发。
当然,如果你能很方便的区分开传入视图的参数是 arg1
还是 arg2
,第一二种情况你可以合并为一条路由 path("url/<arg>/", views.args)
,然后在视图函数中这样写:
def args(request, arg=None, arg1=None, arg2=None): print(arg, arg1, arg2) if arg in arg1_list and arg1 is None and arg2 is None: return HttpResponse("第一种情况") if arg in arg2_list and arg1 is None and arg2 is None: return HttpResponse("第二种情况") if arg is None and arg1 is None and arg2 is None: return HttpResponse("第三种情况") if arg is None and arg1 is not None and arg2 is not None: return HttpResponse("第四种情况")
其中 arg1_list
和 arg2_list
分别是 arg1
和 arg2
的所有可能的值的列表。
所以我有一些路线,比如<code>/category/tech</code>和<code</categority/tech/new<code>和<code>/category/tech/old</code>等等 他们都使用 或者我必须分别定义它们,就像
问题内容: 我可以设置带有可选参数的路由(相同的模板和控制器,但是如果某些参数不存在,则应将其忽略)? 因此,只编写一个规则,而不是编写以下两个规则? 这样的事情([此参数是可选的]) 我在他们的文档中找不到任何内容。 问题答案: 看来Angular现在已对此提供支持。 从最新的(v1.2.0)文档中: 可以包含带问号()的可选命名组
问题内容: 我可以在AngularJS中设置路由参数的默认值吗?有没有有办法,并通过相同的途径来处理? 我希望重构现有的代码,如下所示: 它可以工作,但不是很优雅。有没有更好的办法 ? 问题答案: 不允许使用路由参数的默认值。 但是(中的)路由 不应具有默认参数。 资源可以具有默认参数。 在如果你想使用一个可选的参数的路线,这实际上是两个不同的路线。 为什么? 路线应该很简单 路由不允许参数的正则
例如,在具有分页列表的路由上,网址可能如下所示,表示我们已加载第二个网页: 使用指令和来传递查询参数。例如: 或者,我们可以使用服务通过JS跳转: 读取查询参数 See Official Documentation on Query Parameters
路由参数 路由分组及规则定义支持指定路由参数,这些参数主要完成路由匹配检测以及行为执行。5.1版本极大改进了路由参数的用法。 路由参数可以在定义路由规则的时候直接传入(批量),不过5.1采用了更加面向对象的方式进行路由参数配置,因此使用方法配置更加清晰。 参数 说明 方法名 method 请求类型检测,支持多个请求类型 method ext URL后缀检测,支持匹配多个后缀 ext deny_ex
问题内容: 我的理解是,对于Spring数据JPA,我无法使用查询方法来获取列等于给定非空方法参数的所有行,而当方法参数为null时,无法使用相同的方法来获取此列为NULL的所有行。 。 那是对的吗? 因此,我必须在我的JAVA代码中对此进行区分,并且必须使用单独的查询方法明确要求空值,如下面的示例所示? 不好的是,如果我有4个可以为null的参数,并且必须编写16种不同的查询方法。 问题答案: