有人可以解释一下如何编写url模式并查看允许可选参数的视图吗?我已成功完成此操作,但我总是打破网址模板标记。
这是我目前所拥有的:
模式
(r'^so/(?P<required>\d+)/?(?P<optional>(.*))/?$', 'myapp.so')
查看
def so(request, required, optional):
如果我在这个示例中使用url模板标记提供两个参数,它可以正常工作;但是,如果我省略了可选参数,则会出现反转错误。
我该如何做到这一点?
谢谢, 皮特
答案 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)
你做的很简单。
def so(request, required, optional=None):
当你在url字符串中没有可选 param时,你的代码中将为None。
简单而优雅:)
答案 6 :(得分:-2)
根据您的使用情况,您可能只想传递一个url参数,如下所示:
url/?parameter=foo
在您的观点中调用此内容:
request.REQUEST.get('parameter')
这将返回&#39; foo&#39;