Python 在django中获取可选参数?

Python 在django中获取可选参数?,python,regex,django,Python,Regex,Django,有人能解释一下如何编写允许可选参数的url模式和视图吗?我已经成功地做到了这一点,但我总是打破url模板标记 以下是我目前拥有的: 模式 (r'^so/(?P<required>\d+)/?(?P<optional>(.*))/?$', 'myapp.so') 如果我在本例中使用url模板标记来提供这两个参数,它就可以正常工作;但是,如果省略可选参数,则会得到一个反向错误 我怎样才能做到这一点 谢谢, 皮特我通常会用a制作两种图案: url(r'^so/(?P\d+/$

有人能解释一下如何编写允许可选参数的url模式和视图吗?我已经成功地做到了这一点,但我总是打破url模板标记

以下是我目前拥有的:

模式

(r'^so/(?P<required>\d+)/?(?P<optional>(.*))/?$', 'myapp.so')
如果我在本例中使用url模板标记来提供这两个参数,它就可以正常工作;但是,如果省略可选参数,则会得到一个反向错误

我怎样才能做到这一点

谢谢,
皮特

我通常会用a制作两种图案:

url(r'^so/(?P\d+/$),'myapp.so',name='something'),
url(r'^so/(?P\d+)/(?P.*)/$,'myapp.so',name='something',

为什么没有两种模式:

(r'^so/(?P<required>\d+)/(?P<optional>.*)/$', view='myapp.so', name='optional'),
(r'^so/(?P<required>\d+)/$', view='myapp.so', kwargs={'optional':None}, name='required'),
(r'^so/(?P\d+)/(?P.*)/$,view='myapp.so',name='optional'),
(r“^so/(?P\d+/$”,view='myapp.so',kwargs={'optional':None},name='required'),

其他人已经演示了使用两个单独的命名URL模式处理此问题的方法。如果URL模式的一部分重复让您感到困扰,可以使用include()来消除它:

url(r'^so/(?P\d+/),包括('myapp.required_url'))
然后添加所需的_urls.py文件,其中包含:

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

一般来说,除非有相当多的URL(当然不止两个)有一个共同的前缀,否则我不认为这是值得的。

< P> > VIEW。PY,你做简单的事情。

def so(request, required, optional=None): 
当您在url字符串中没有得到可选的参数时,它将在代码中没有


简单而优雅:)

Django URL是多态的:

url(r'^so/(?P<required>\d+)/$', 'myapp.so', name='sample_view'),
url(r'^so/(?P<required>\d+)/(?P<optional>.*)/$', 'myapp.so', name='sample_view'),
所以,您可以使用相同的名称来调用它,并且它可以很好地使用url解析器。但是,请注意,您不能将None作为必需参数传递,并期望它可以让您在没有参数的情况下访问regexp:

错误:

{% url sample_view required optional %}
正确:

{% if optional %}
    {% url sample_view required optional %}
{% else %}
    {% url sample_view required %}
{% endif %}

我不知道这是否被记录在任何地方-我偶然发现了它-我忘了重写url名称,而且它仍然有效:)

适用于仍有此问题的任何人。 我使用Django 1.5(更新:使用1.8),它仍然可以正常工作

我使用:

{% url '<namespace>:start' app.id %}
{% url '<namespace>:start' app.id server.id %}
url.py

url(r'^(?P<app_id>\d+)/start/+(?P<server_id>\d+)?', views.restart, name='restart')

我使用:

{% url '<namespace>:start' app.id %}
{% url '<namespace>:start' app.id server.id %}
{%url':开始'app.id%}
{%url':开始'app.id server.id%}
这将创建URL

/1/start/2 and 
/1/start/ <- notice the slash.
/1/start/2和

/1/start/根据您的用例,您可能只想传递如下url参数:

url/?parameter=foo
在你看来,这就是:

request.REQUEST.get('parameter')

这将返回“foo”

不管您将这些URL模式放在哪个顺序中。它们的结尾都以美元为界,因此不存在歧义。当然,也有类似的情况(例如,如果较短的模式是无界的),这很重要。URL反向器对正则表达式的智能有限(它没有实现完整的正则表达式解析器),并且不能处理可选部分。你可以自由地在你的URL模式中使用正则表达式的全部功能,但是你放弃了URL反转。谢谢,这就是我想要的。我很惊讶地发现我需要两个单独的URL。请参阅此处了解另一种方法(不知道这种方法与Django的哪个版本兼容-但我使用1.4):我尝试通过使用“?”来获得可选参数时遇到了困难,它在大多数情况下都有效,但并非所有情况下都有效,与反向URL有关的问题。这是最干净的解决方案。谢谢Carl,这看起来也会派上用场。您可以使用
patterns
来避免创建新文件:
url(r'…',include(patterns('',url(…),url(…)))
。它在1.3的路线图上:它在哪个版本的Django中工作?我有1.5版本,如果url.py中没有更改,这将无法工作。这适用于views.py方法。因为Django在URL管理和应用视图方面改变了很多东西,所以它的价值被大大降低了。[例如,基于类的视图];在django中不能这样做,它首先查看
url.py
&将找不到任何与url匹配的模式。由于此选项位于
views.py中,并且在找到模式之前不会运行,因此我的问题是将可选参数传递给view函数以及将其与url模板标记一起使用。
/1/start
{% url '<namespace>:start' app.id %}
{% url '<namespace>:start' app.id server.id %}
/1/start/2 and 
/1/start/ <- notice the slash.
url/?parameter=foo
request.REQUEST.get('parameter')