在django中可选获取参数?

sly*_*ete 25 python regex django

有人可以解释一下你如何编写一个url模式和允许可选参数的视图?我已成功完成此操作,但我总是打破url模板标记.

这是我目前的情况:

图案

(r'^so/(?P<required>\d+)/?(?P<optional>(.*))/?$', 'myapp.so')
Run Code Online (Sandbox Code Playgroud)

视图

def so(request, required, optional):
Run Code Online (Sandbox Code Playgroud)

如果我在这个示例中使用url模板标记提供两个参数,它就可以正常工作; 但是,如果我省略了可选参数,我会得到一个反转错误.

我怎么能做到这一点?

谢谢,皮特

Tod*_*ner 38

我通常使用一个名为url的两个模式:

url(r'^so/(?P<required>\d+)/$', 'myapp.so', name='something'),
url(r'^so/(?P<required>\d+)/(?P<optional>.*)/$', 'myapp.so', name='something_else'),
Run Code Online (Sandbox Code Playgroud)

  • 是的,这是通常的做法.URL反向器只有有限的关于正则表达式的智能(它没有实现完整的正则表达式解析器),并且它无法处理可选部分.您可以在URL模式中自由使用正则表达式的全部功能,但随后您将放弃URL反转. (2认同)

Vis*_*oru 18

Django网址是多态的:

url(r'^so/(?P<required>\d+)/$', 'myapp.so', name='sample_view'),
url(r'^so/(?P<required>\d+)/(?P<optional>.*)/$', 'myapp.so', name='sample_view'),
Run Code Online (Sandbox Code Playgroud)

很想知道你必须这样做:

def sample_view(request, required, optional = None):
Run Code Online (Sandbox Code Playgroud)

所以你可以使用相同的名称调用它,它将工作url解析器工作正常.但请注意,您不能将None作为必需参数传递,并期望它将使您无需参数进入正则表达式:

错误:

{% url sample_view required optional %}
Run Code Online (Sandbox Code Playgroud)

正确:

{% if optional %}
    {% url sample_view required optional %}
{% else %}
    {% url sample_view required %}
{% endif %}
Run Code Online (Sandbox Code Playgroud)

我不知道这是否记录在任何地方 - 我偶然发现它 - 我忘了重写网址名称,它仍在工作:)


Car*_*yer 5

其他人已经展示了使用两个单独命名的URL模式来处理此问题的方法.如果重复部分URL模式困扰您,可以通过使用include()来摆脱它:

url(r'^so/(?P<required>\d+)/', include('myapp.required_urls'))
Run Code Online (Sandbox Code Playgroud)

然后添加一个required_urls.py文件:

url(r'^$', 'myapp.so', name='something')
url(r'^(?P<optional>.+)/$', 'myapp.so', name='something_else')
Run Code Online (Sandbox Code Playgroud)

通常我不认为这是值得的,除非有相当多的URL(当然超过两个)的共同前缀.