在django中可选获取参数?

时间:2009-08-30 01:43:34

标签: python regex django

有人可以解释一下如何编写url模式并查看允许可选参数的视图吗?我已成功完成此操作,但我总是打破网址模板标记。

这是我目前所拥有的:

模式

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

查看

def so(request, required, optional):

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

我该如何做到这一点?

谢谢, 皮特

7 个答案:

答案 0 :(得分:38)

我通常使用named url制作两种模式:

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

答案 1 :(得分:17)

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'),

很遗憾你必须这样做:

def sample_view(request, required, optional = None):

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

错误:

{% url sample_view required optional %}

<强>正确:

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

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

答案 2 :(得分:5)

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

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

然后使用:

添加required_urls.py文件
url(r'^$', 'myapp.so', name='something')
url(r'^(?P<optional>.+)/$', 'myapp.so', name='something_else')

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

答案 3 :(得分:1)

为什么没有两种模式:

(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'),

答案 4 :(得分:1)

对于仍有这个问题的人。 我使用Django 1.5(更新:使用1.8),它仍然正常工作。

我用:

<强> urls.py

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

然后当我想要两个网址时

/1/start/2

/1/start

我用:

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

这将创建网址

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

如果您手动创建网址,则必须牢记这一点。

我箍这对任何人都有帮助!

答案 5 :(得分:-1)

在views.py中

你做的很简单。

def so(request, required, optional=None): 

当你在url字符串中没有可选 param时,你的代码中将为None。

简单而优雅:)

答案 6 :(得分:-2)

根据您的使用情况,您可能只想传递一个url参数,如下所示:

url/?parameter=foo

在您的观点中调用此内容:

request.REQUEST.get('parameter')

这将返回&#39; foo&#39;