当前位置: 首页 > 知识库问答 >
问题:

python - django路由参数可以为空吗?

越英韶
2023-08-22
path(r'category/<slug:title>/', (views.CategorysTagView.as_view(), name='category'),

上述URL中的title可以默认为空吗,例如可传可不传!

共有2个答案

马朝斑
2023-08-22

你题目中描述的方式, 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
李新霁
2023-08-22

不可以。

str - 匹配除了 '/' 之外的 非空字符串。如果表达式内不包含转换器,则会默认匹配字符串。

来自:https://docs.djangoproject.com/zh-hans/4.2/topics/http/urls/#...


更新 1:

查看示例仓库: https://jihulab.com/zhoushengdao-sf/django-route

如果像这样一个路径:url/<arg1>/<arg2>/,如果参数可以为空的话,那么有以下四种情况:

  1. <arg2> 为空的话,那么 url 就是 url/<arg1>/,(经过测试,多个连续的斜杠会被视为一个);
  2. <arg1> 为空的话,那么 url 就是 url/<arg2>/
  3. <arg1><arg2> 都为空,那么 url 就是 url/
  4. <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_listarg2_list 分别是 arg1arg2 的所有可能的值的列表。

 类似资料:
  • 所以我有一些路线,比如<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种不同的查询方法。 问题答案: