在模板中重写get_absolute_url方法 - django 1.6.5

时间:2014-08-12 22:03:51

标签: django django-templates

有没有其他方法在Django中编写get_absolute_url方法? 我在名为 category_list.html 的模板中编写了它,存储在名为tags的目录中,如下:

{% for c in active_categories %} 
<a href="{{ c.get_absolute_url }}">{{ c.name }}</a>
<br /> 
{% endfor %}

此外,在名为“ catalog.html ”的另一个模板中,我包含以下行: {%include“tags / category_list.html”%}

这是models.py中的get_absolute_url的实现:

@models.permalink
def get_absolute_url(self):
    return ('catalog_product', (), { 'product_slug': self.slug })

此外,这是我在urls.py文件中包含的内容:

urlpatterns = patterns('catalog.views',
url(r'^$', 'index', {'template_name':'catalog/index.html'}, 'catalog_home'),
url(r'^category/(?P<category_slug>[-\w]+)/$', 'show_category', {'template_name':'catalog/category.html'},
    'catalog_category'),
url(r'^product/(?P<product_slug>[-\w]+)/$', 'show_product', {'template_name':'catalog/product.html'},
    'catalog_product'),

然而,它给出了这个错误: / catalog / 的NoReverseMatch。 还有另一种方法吗?或者我写的代码是错误的,对于django 1.6.5?

Link to Image of Error Message

2 个答案:

答案 0 :(得分:1)

您尝试将url的名称作为参数传递,当它们应该是关键字参数时,指定name。所以,一个例子如下:

url(r'^$', 'index', {'template_name': 'catalog/index.html'}, name='catalog_home'),

所以,现在当你从一个观点来电话时:

reverse('catalog_home')或您的模板{% url 'catalog_home' %}

Django将在您的urls.py中搜索名称为'catalog_home'的网址,并正确找到它。

Alasdair是正确的,它很可能是模板中早先发现的引发此错误的网址,而不是您认为错误发生的位置。

此外,有些不相关,但您将通过Django文档找到的标准是使用短划线(-)命名您的网址,而不是下划线。因此'catalog_home'将为'catalog-home'

答案 1 :(得分:0)

谢谢大家的帮助。 将网址编写为url(r'^$', 'index', {'template_name': 'catalog/index.html'}, name='catalog_home'),并从@permalink方法定义中删除get_absolute_url()会有所帮助。 此代码是使用旧版Django的教程编写的,并且不再使用@permalink,也不再需要@permalink! 相反,如果仍然希望使用:

get_absolute_url = models.permalink(get_absolute_url)

使用get_absolute_function()定义(版本1.4以后)。