[英]Optional get parameters in django?
有人可以解釋一下你如何編寫一個url模式和允許可選參數的視圖? 我已成功完成此操作,但我總是打破url模板標記。
這是我目前的情況:
圖案
(r'^so/(?P<required>\d+)/?(?P<optional>(.*))/?$', 'myapp.so')
視圖
def so(request, required, optional):
如果我在這個示例中使用url模板標記提供兩個參數,它就可以正常工作; 但是,如果我省略了可選參數,我會得到一個反轉錯誤。
我怎么能做到這一點?
謝謝,皮特
我通常使用一個名為url的兩個模式:
url(r'^so/(?P<required>\d+)/$', 'myapp.so', name='something'),
url(r'^so/(?P<required>\d+)/(?P<optional>.*)/$', 'myapp.so', name='something_else'),
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 %}
我不知道這是否記錄在任何地方 - 我偶然發現它 - 我忘了重寫網址名稱,它仍在工作:)
其他人已經展示了使用兩個單獨命名的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(當然超過兩個)的共同前綴。
為什么不有兩種模式:
(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'),
對於仍然有這個問題的人。 我使用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.
如果您手動創建網址,則必須牢記這一點。
我箍這有助於任何人!
在views.py中,你做的很簡單。
def so(request, required, optional=None):
當你在url字符串中沒有得到可選的 param時,你的代碼中將是None。
簡單而優雅:)
根據您的使用情況,您可能只想傳遞一個url參數,如下所示:
url/?parameter=foo
在您的視圖中調用此方法:
request.REQUEST.get('parameter')
這將返回'foo'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.