簡體   English   中英

在django中可選獲取參數?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM