2011-06-14 15 views
1

我試圖限定使用Django一個搜索URL具有以下結構問題和Django URL表達式

www.example.com/afdata/search?device=television&category=news&query=channel&limit=30/ 

我的目標是提取值televisionnews,從上述URL和通channel30它被定義爲一個視圖如下

def search(request, device='all', category='single', query='', limit=30): 
    return HttpResponse("device=%s, category=%s, query=%s, limit=%d", device, category, query, limit) 

afdata是應用程序和URL配置文件中我定義的URL如下:

from django.conf.urls.defaults import * 

urlpatterns = patterns('afdata.views', 
    (r'^$', 'index'), 
    (r'^search?device=(?P<device>.*)&category=(?P<category>.*)&query=(?P<query>.*)&limit=(?P<limit>d+)/$', 'search') 
) 

當我在瀏覽器中使用上述搜索查詢時,我得到500 Internal Server Errorindex回覆良好。任何關於我可能做錯的建議?

回答

5

我建議你改變你的搜索網址:

(r'^search', 'search') 

然後在您的視圖做

def search(request): 
    device = request.GET.get('device', 'all') 
    category = request.GET.get('category', 'single') 
    query = request.GET.get('query', '') 
    limit = request.GET.get('limit', 30) 

    return HttpResponse("device=%s, category=%s, query=%s, limit=%d", device, category, query, limit) 

這是更爲穩健和多變和靈活。

+1

它也更加正確:-) – 2011-06-14 05:58:35

+1

@luke正確?!這只是一個小細節;) – 2011-06-14 05:59:15

+0

@詹姆斯,網址的結構如下? 'www.example.com/search?device=television?category=news?query=channel?限制= 30' – David 2011-06-14 06:18:46

1

查看Apache日誌中的堆棧跟蹤。另外:您確定您的搜索()的第二行不是指HTTPResponse不是HTTPRequest?

+0

是的,'HttpResponse'是正確的。我嘗試過,但仍然是同樣的問題。我會看看堆棧跟蹤。 – David 2011-06-14 05:42:52

1

通過使用.* Django可能會通過您的&category。即使情況並非如此,通常以不允許的方式構造正則表達式是一種很好的做法。我會考慮改變你的.*[^&]*

3

Django的URL模式與URL的查詢部分(以?開頭的部分)不匹配。如果您在URL結構本身中嵌入了參數,則只能執行您想要執行的操作。

查看the Django docs準確的細節。

因此,如果您的網址是:

www.example.com/afdata/search/device/television/category/news/query/channel/limit/30/ 

然後你將通過類似的URL模式匹配它:

urlpatterns = patterns('afdata.views', 
    (r'^$', 'index'), 
    (r'^search/device/(?P<device>.*)/category/(?P<category>.*)/query/(?P<query>.*)/limit/(?P<limit>d+)/$', 'search') 
) 

(這將是一個有些奇怪的URL慣例,但它會工作)。

如果您的網址中有查詢,您只匹配?之前的部分,然後您的視圖需要p從request.GET剔除參數。 (如果在你的例子中你已經有了這樣的函數,寫一些膠水代碼來傳遞參數是很容易的。)

+1

感謝您的詳細解釋。現在有道理。 – David 2011-06-14 06:59:17