2017-08-31 71 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