【问题标题】:Django, url tag in template doesn't work: NoReverseMatchDjango,模板中的 url 标签不起作用:NoReverseMatch
【发布时间】:2012-10-10 14:49:39
【问题描述】:

我在 django 的模板中生成反向 url 时遇到了问题。几个小时以来,我一直在尝试解决它,但我不知道问题可能是什么。 URL 反转在模型和视图中效果很好:

# like this in models.py
@models.permalink
    def get_absolute_url(self):
        return ('entry', (), {
            'entry_id': self.entry.id,
        })

# or this in views.py
return HttpResponseRedirect(reverse('entry',args=(entry_id,)))

但是当我尝试在模板中制作它时,我收到了这样的错误:

NoReverseMatch 在 /entry/1/
未找到带有参数“(1L,)”和关键字参数“{}”的“add_comment”的反向操作。

我的文件结构如下:

project/
├── frontend
│   ├── models.py
│   ├── urls.py
│   └── views.py
├── settings.py
├── templates
│   ├── add_comment.html
│   └── entry.html
├── utils
│   └── with_template.py
└── wsgi.py

我的 urls.py:

from project.frontend.views import *
from django.conf.urls import patterns, include, url

urlpatterns = patterns('project.frontend.views',

    url(r'^entry/(?P<entry_id>\d+)/', 'entry', name="entry"),
    (r'^entry_list/', 'entry_list'),

然后entry_list.html:

{% extends "base.html" %}
{% block content %}
    {% for entry in entries %}
            {% url 'entry' entry.id %}
    {% endfor %}
{% endblock %}

在 views.py 我有:

@with_template
def entry(request, entry_id):
    entry = Entry.objects.get(id=entry_id)
    entry.comments = entry.get_comments()
    return locals()

with_template 在哪里跟随装饰器(但我不认为这是一种情况):

class TheWrapper(object):
    def __init__(self, default_template_name):
        self.default_template_name = default_template_name

    def __call__(self, func):
        def decorated_func(request, *args, **kwargs):
            extra_context = kwargs.pop('extra_context', {})
            dictionary = {}
            ret = func(request, *args, **kwargs)
            if isinstance(ret, HttpResponse):
                return ret
            dictionary.update(ret)
            dictionary.update(extra_context)
            return render_to_response(dictionary.get('template_name',
                                                     self.default_template_name),
                                      context_instance=RequestContext(request),
                                      dictionary=dictionary)
        update_wrapper(decorated_func, func)
        return decorated_func

if not callable(arg):
    return TheWrapper(arg)
else:
    default_template_name = ''.join([ arg.__name__, '.html'])
    return TheWrapper(default_template_name)(arg)

您有什么想法,可能导致问题的原因是什么? 非常感谢!


编辑: 我刚刚做了一个实验。我评论了我只能离开的一切: urls.py

# -*- coding: UTF-8 -*-
from justmetyou.frontend.views import *
from django.conf.urls import patterns, include, url
urlpatterns = patterns('justmetyou.frontend.views',
    url(r'^entry/(?P<entry_id>\d+)/', 'entry', name="entry"),
)

views.py

# -*- coding: UTF-8 -*-
from justmetyou.frontend.models import *
from django.shortcuts import render_to_response, get_object_or_404
def entry(request, entry_id):
    entry = Entry.objects.get(id=entry_id)
    return render_to_response('entry.html', {'entry':entry})

entry.html

{% extends "base.html" %}
{% block content %}
{% url 'entry' 1 %}
{% endblock %}

什么都没有改变。我总是遇到同样的错误。 所以现在我更加困惑了,因为在这个简单的代码中一切看起来都很好。你认为这可能是像服务器这样的外部东西或像这样的东西......?我不知道...

【问题讨论】:

  • 看起来问题出在add_comment URL,而不是entry。告诉我们entry.html?

标签: python django templates url reverse


【解决方案1】:

我怀疑你使用的是 Django 1.3 而你没有调用{% load url from future %}

因此,请尝试在 URL 名称周围不使用 '

{% url entry 1 %}

【讨论】:

  • 我使用的是 Django 1.4.1,但你是对的,情况就是这样。非常感谢! :) 我不认为这可能是这样的愚蠢错误......
猜你喜欢
  • 2011-04-28
  • 1970-01-01
  • 2021-01-15
  • 2014-07-17
  • 2023-03-28
  • 2016-03-22
  • 2018-12-17
  • 2012-08-23
  • 2019-06-24
相关资源
最近更新 更多