【问题标题】:Why this string comes with appending some special characters?为什么这个字符串附带一些特殊字符?
【发布时间】:2016-06-09 16:07:00
【问题描述】:

这是我的html代码

<b><a href="{% url 'polls:logout_info' %}">logout</a></b>
<b><a href={% url 'polls:edit' author %}>Edit</a></b>
<br>

<center><h2> -- WELCOME {{ name }} -- </h2></center>
{% if errors %}
        <ul>
            {% for error in errors %}
            <center>{{ error }}</center>
            {% endfor %}
        </ul>
{% endif %}<br>

这里是 url.py 代码(仅显示与此代码相关的 url)

从 django.conf.urls 导入 url

从 .导入视图

urlpatterns = [
    url( r'^login/$', views.login ,name='login'),
    url( r'^saveinfo/$', views.saveinfo ,name='saveinfo'),
    url( r'^indexmain/$', views.indexmain ,name='indexmain'),
    url( r'^indexmain1/$', views.indexmain1 ,name='indexmain1'),
    url( r'^homemain/$', views.homemain ,name='homemain'),
    url( r'^logout_info/$', views.logout_info ,name='logout_info'),
    url( r'^edit/(?P<author>[a-z]+)/$', views.edit ,name='edit'),
]

我收到了这个错误:

NoReverseMatch at /polls/login/ Reverse for '' with arguments '('pratiksha ',)' 和关键字参数 '{}' 未找到。 0 个图案 试过:[]

为什么这个字符串会附加一些特殊字符??

【问题讨论】:

  • 在哪里?我不明白你在问什么
  • author = "pratiksha" ,所以当我通过上面显示的 url 时......字符串附加了一些特殊字符。即 '('pratiksha ',)' 像这样。
  • 额外的字符正是 django 处理参数的方式。 Django 将所有参数放在一个元组中,并在错误消息中显示该元组。如果您将 2 个参数传递到您的 URL,参数将如下所示:'('pratiksha ', '2nd-parameter')'
  • 是的,但在 url.py 中它也不匹配模式。 :-(
  • 你能展示你的整个 urlpatterns 结构吗?我的意思是从根urlpatterns 到那个'edit' url,你可以省略任何其他的URL,我只需要所有patternsincludeurl 用于那个确切的url 模式。

标签: html regex django url


【解决方案1】:

让我们解释如何阅读NoReverseMatch错误。

错误消息中显示了 5 个变量:

  1. 模式名称:显示在“Reverse for”之后,位于两个撇号之间。
  2. 传递的位置参数列表:显示在“带参数”之后,也在两个撇号之间,以元组的形式。记住!所有模式都在一个元组中呈现,这可能会让您感到困惑。
  3. 传递的关键字参数的字典:显示在“和关键字参数”之后,也在两个撇号之间,以字典的形式。
  4. 尝试过的模式数:显示在“未找到”之后,为整数。
  5. 尝试过的模式列表:显示在“尝试过的模式:”之后,作为 python 列表。

现在,了解一下 URL 反转的工作原理:django 将尝试查找与您提供的模式名称匹配的所有 urlpatterns。对于每个模式名称,它将检查是否可以将提供的位置或关键字参数插入到参数中以代替正则表达式组。所有这些模式都将被列为已尝试的模式。

现在,从错误消息中我们可以发现 1. 没有尝试任何模式,所以没有找到匹配提供的模式名称的模式。该问题的解决方案很简单:您将 'polls:edit' 传递给 url 标记,但您的模式名为 'edit' 并且未在命名空间 'polls' 中注册。您可以通过仅传递“编辑”或将模式移动到命名空间来解决此问题:

urlpatterns = [
    url( r'^login/$', views.login ,name='login'),
    url( r'^saveinfo/$', views.saveinfo ,name='saveinfo'),
    url( r'^indexmain/$', views.indexmain ,name='indexmain'),
    url( r'^indexmain1/$', views.indexmain1 ,name='indexmain1'),
    url( r'^homemain/$', views.homemain ,name='homemain'),

    url( r'^', include([
        url( r'^logout_info/$', views.logout_info ,name='logout_info'),
        url( r'^edit/(?P<author>[a-z]+)/$', views.edit ,name='edit'),
    ], namespace="polls")),
]
  1. 在第一个(也是唯一的)位置参数的末尾有一个额外的空格。你的正则表达式不会接受它,所以它不会被匹配。你必须摆脱那个空白。在您看来,只需调用:

    context['author'] = context['author'].strip()

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-05
  • 1970-01-01
  • 2020-07-12
  • 2018-02-24
相关资源
最近更新 更多