【问题标题】:Passing strings to Django URL in template在模板中将字符串传递给 Django URL
【发布时间】:2015-11-12 23:17:21
【问题描述】:

我认为这可能是非常简单的事情,但我一生都无法弄清楚为什么这些网址不匹配。

我的模板代码如下所示:

<form action="{% url 'view_record' "facility_report" %}" method="post">
{% csrf_token %}

{{ form }}

<input type="submit" value="View Report" name='view' label="Submit">  </form>

然后该 url 应该与我的 url conf 中的这一行匹配:

url(r'^view_record/((?P<report_type>.+)/)?$', views.view_record, name='view_record'),

我在这里缺少什么?它们根本不匹配,有关此的大多数其他问题都来自五年前,当时引擎似乎对格式更加挑剔。

Exception Type: NoReverseMatch at /view_record/
Exception Value: Reverse for 'view_record' with arguments '('facility_report',)' and keyword arguments '{}' not found. 1 pattern(s) tried: ['view_record/((?P<report_type>(.*))/)?$']

【问题讨论】:

  • 你能显示你的views.py文件吗?
  • 回溯说什么?
  • 这是一个反向 url 匹配错误,尝试发布的 url 后无法匹配 '('facility_record',)'。我会贴出确切的日志并立即查看。
  • 好的,添加了错误信息。视图实际上相当大,据我所知与错误无关。
  • 您能说出您在视图中传递的论点吗?

标签: python django django-templates django-urls


【解决方案1】:

((?P&lt;report_type&gt;.+)/)? 中的外部组是捕获组。 Django 的 url 反转无法处理嵌套的捕获组,因此它只会捕获外部组作为可能的参数。由于第一个参数没有以 / 结尾,因此模式不匹配并抛出 NoReverseMatch

您可以将外部组更改为非捕获组,Django 会将内部组作为捕获组。这样,参数不必包含/,因为只有内部组被替换,外部组按原样使用。

要创建非捕获组,请以?: 开头:

url(r'^view_record/(?:(?P<report_type>.+)/)?$', views.view_record, name='view_record'),

【讨论】:

    【解决方案2】:

    你可以这样做:

    <form action="{%url 'view_record' 'facility_report'%}" method="post">
    

    在你的urls.py:

    url(r'^view_record/(?P<report_type>(.*))/$', views.view_record, name='view_record')
    

    这应该将表单发送到正确的 url。

    【讨论】:

    • 如果可能,我会尽量避免对 url 进行硬编码。
    • 更新了答案。问题可能是由于引号引起的。希望这能解决您的问题。
    • 它一直给我和以前一样的错误。这似乎是正确的格式,但我真的很困惑为什么它不匹配。
    猜你喜欢
    • 2013-10-21
    • 2017-12-14
    • 2012-02-02
    • 2016-04-25
    • 1970-01-01
    • 1970-01-01
    • 2012-03-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多