2017-08-31 70 views
2

我想在Django中創建一個簡單的搜索表單。以下是我迄今爲止:NoReverseMatch:無法從模板傳遞參數進行查看。

形式:

<form action="{% url 'search_pub' pub_name=pub_name %}" method="get"> 
    Publication name: <input type="text" id="pub_name" name="pub_name" value="herald"> 
    <input type="submit" value="Search"> 
</form> 

urls.py

url(r'^search/$', views.search, name='search'), 
url(r'^results/(?P<pub_name>[\w]+)/$', views.search_pub, name='search_pub'), 

views.py

def search(request): 
    return render(request, 'urlapp/search.html') 

def search_pub(request, pub_name): 
    pubs = Publication.objects.all().filter(title__icontains=pub_name) 
    return render(request, 'app/results.html', { 
     'publications': pubs 
    }) 

models.py

class Publication(models.Model): 
    title = models.CharField(max_length=30) 

我收到以下錯誤,當我打開搜索頁面http://localhost:8000/search/

NoReverseMatch at /search/ 
Reverse for 'search_pub' with keyword arguments '{'pub_name': ''}' not found. 1 pattern(s) tried: ['results/(?P<pub_name>[\\w]+)/$'] 

我驗證了正則表達式是有效使用本網站pythex

如果我轉到URL:http://localhost:8000/results/herald,我會得到正確的結果。

我錯過了什麼?

+0

價值? – Rohan

+0

是的,我無法弄清楚爲什麼。 – Animesh

回答

1

您不能像使用URL參數那樣使用GET變量。此外,{% url ...值是在服務器端計算的,因此您不能在HTML表單中動態修改它們。我會做到以下幾點:

首先,下面一行

url(r'^results/(?P<pub_name>[\w]+)/$', views.search_pub, name='search_pub'), 

改變

url(r'^results/$', views.search_pub, name='search_pub'), 

然後,更改您的視圖代碼看起來像這樣:

def search_pub(request):     # Remove pub_name from method signature 
    pub_name = request.GET.get('pub_name') # ...and fetch it from GET dict instead 
    ... 

最後,改變你的form標籤:

<form action="{% url 'search_pub' %}" method="get"> 

注意,從現在開始,您的網址將在以下形式:

http://localhost:8000/results?pub_name=herald 

更新:

如果你真的想在URL的值,你可以從一個重定向其他:

保留兩個網址,你urls.py不同名稱:

url(r'^results/(?P<pub_name>[\w]+)/$', views.search_pub, name='search_pub_clean'), 
url(r'^results/$', views.search_pub, name='search_pub'), 

和視圖代碼:`的在pub_name`模板似乎空

from django.shortcuts import redirect 
def search_pub(request, pub_name=None): 
    if pub_name is None: 
     return redirect('search_pub_clean', pub_name=request.GET.get('pub_name')) 
    ... 
+0

這是查詢字符串的方式,我已經嘗試過了。但我正在尋找一個乾淨的URL,比如'/ results/pubname/year'。我是否應該有一個單獨的模型和表單僅用於搜索頁面來完成此操作? – Animesh

+0

你不需要。你可以有兩個URL配置,並從一個到另一個重定向。看到我更新的答案。 – Selcuk

+1

這樣好多了。我現在將有一個重定向來處理。 :) – Animesh