NoReverseMatch:无法将参数从模板传递到视图。
NoReverseMatch: Unable to pass parameter from template to view.
我正在尝试在 Django 中创建一个简单的搜索表单。这是我目前所拥有的:
形式:
<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,我会得到正确的结果。
我错过了什么?
您不能将 GET 变量当作 URL 参数来使用。此外,{% 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">
请注意,从现在开始,您的 URL 将采用以下形式:
http://localhost:8000/results?pub_name=herald
更新:
如果你真的想要 URL 中的值,你可以从一个重定向到另一个:
将两个 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'),
和查看代码:
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'))
...
我正在尝试在 Django 中创建一个简单的搜索表单。这是我目前所拥有的:
形式:
<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,我会得到正确的结果。
我错过了什么?
您不能将 GET 变量当作 URL 参数来使用。此外,{% 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">
请注意,从现在开始,您的 URL 将采用以下形式:
http://localhost:8000/results?pub_name=herald
更新:
如果你真的想要 URL 中的值,你可以从一个重定向到另一个:
将两个 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'),
和查看代码:
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'))
...