NoReverseMatch:无法将参数从模板传递到视图。

Posted

技术标签:

【中文标题】NoReverseMatch:无法将参数从模板传递到视图。【英文标题】:NoReverseMatch: Unable to pass parameter from template to view. 【发布时间】:2018-02-08 21:51:58 【问题描述】:

我正在尝试在 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,我会得到正确的结果。

我错过了什么?

【问题讨论】:

模板中pub_name 的值似乎为空? 是的,我不知道为什么。 【参考方案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'),

以及查看代码:

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'))
    ...

【讨论】:

这是查询字符串的方式,我已经尝试过了。但我希望有一个像/results/pubname/year 这样的干净 URL。我应该有一个单独的模型和表单只用于搜索页面来完成这个吗? 你不需要。您可以有两个 URL 配置并从一个重定向到另一个。请参阅我的更新答案。 这样好多了。我现在将有一个重定向来处理。 :) 这是拥有干净 URL 的最佳方法。您也可以在客户端使用 javascript 来实现这一点,但它需要更多的测试并且更容易出错。 我同意这是一种非常简单的方法,无需为搜索表单使用单独的服务器端表单和模型。谢谢你把这个介绍给我。干杯。

以上是关于NoReverseMatch:无法将参数从模板传递到视图。的主要内容,如果未能解决你的问题,请参考以下文章

django noreversematch 传递参数时出错

Django 捕获 NoReverseMatch - TemplateSyntaxError

Django - NoReverseMatch:“bha”的反向没有找不到参数

NoReverseMatch 在 /sessions/exercise/6/update/

如何将参数从谷歌作曲家传递到数据流模板

django - 将参数从模板传递到 models.py 的函数