【问题标题】:URL template tag causing NoReverseMatch when URL name from an include is used使用包含的 URL 名称时导致 NoReverseMatch 的 URL 模板标记
【发布时间】:2016-09-19 03:46:09
【问题描述】:

具有以下定义:

urls.py

urlpatterns = [
    url(r'^admin/', admin.site.urls),

    # Homepage
    url(r'^$', projects.homepage, name='homepage'),
    url(r'^create_new_project/$', projects.create_new_project),

    # Project page
    url(r'^(?P<project_path>\w+)/', include('projects.urls')),        
]

projects/urls.py

from . import views as projects
from gpuz import views as gpuz  # gpuz as a sample tool
from models import views as models

urlpatterns = [
    url(r'^$', projects.projectpage, name='project-page'),
    url(r'^gpuz/$', gpuz.page),
    url(r'^settings/$', models.settings_new),
]

我能够解析诸如 localhost/myproject/localhost/myproject/gpuz/ 之类的 URL,但通过模板生成 URL 会出现 NoReverseMatch 错误。

例子:

base.html

<div class="navbar-collapse collapse ">
    <ul id="menu-top" class="nav navbar-nav navbar-right">
        <li><a href="{% url 'homepage' %}" class="navbar-btn-home">Home</a></li>

        {% if project %}
            <!-- NoReverseMatch -->
            <li><a href="{% url 'project-page' %}">{{ project.name }}</a></li>
        {% endif %}

        {% if project_tools %}
            {% for tool in project_tools %}
                <!-- Expected URL: /myproject/gpuz/ -->
                <li><a href="{% url 'project-page' tool.name %}" class="navbar-btn-{{tool.name}}">{{ tool.name }}</a></li>
            {% endfor %}

            <li><a href="/settings" class="navbar-btn-settings">Settings</a></li>
        {% endif %}
    </ul>
</div>

我正在关注这里的示例:https://docs.djangoproject.com/en/1.10/ref/templates/builtins/#url,但它似乎对我不起作用,我不知道出了什么问题。我没有在代码中的任何地方使用reverse()

错误信息:

NoReverseMatch

{% if project %}
    <li><a href="{% url 'project-page' %}">{{ project.name }}</a></li>
{% endif %}

Exception Type: NoReverseMatch
Exception Value: Reverse for 'project-page' with arguments '()' and keyword arguments '{}' not found. 0 pattern(s) tried: []

临时解决方法

我花了太多时间试图解决这个问题,所以我目前的解决方法是链接变量以形成伪硬编码 URL,例如href="/{{ project.url_path }}/{{ tool.name }}/"

【问题讨论】:

  • 你期望在{% url 'project-page' %}得到什么
  • 当您尝试将tool.name 作为参数传递时,您对project-page 的定义不接受任何参数。
  • project-pageurl 标记需要一个参数 project_path
  • @Aison /myproject/ 在这个例子中
  • @Selcuk 我仍然得到 NoReverseMatch 没有任何参数

标签: python django django-urls


【解决方案1】:

试试这个:

<li><a href="{% url 'projects:project-page' %}">{{ project.name }}</a></li>

【讨论】:

  • 即使在projects/urls.py 中添加app_name = projects 后也不起作用。
【解决方案2】:
url(r'^(?P<project_path>\w+)/', include('projects.urls'))

如果你把这个 url 放在主 urls.py 中,你需要从 Html 页面传递项目路径,否则它会引发异常,就像没有反向匹配一样,所以正确的方法是

主 urls.py

url(r'^$', include('projects.urls')), 

项目 urls.py

添加项目路径url(注意:从模板中传递项目路径,如{% url 'project-page' project.path %} )

【讨论】:

  • 不起作用,它现在会破坏其他页面。我觉得它将正则表达式作为字符串而不是实际的 URL 路径(我可能错了)
  • url(r'^',include('projects.urls')),
猜你喜欢
  • 2023-03-08
  • 1970-01-01
  • 2018-12-17
  • 2023-03-28
  • 1970-01-01
  • 2015-01-03
  • 2023-03-20
  • 2012-10-10
  • 2014-07-17
相关资源
最近更新 更多