让@permalink装饰器与django通用视图一起使用?

时间:2010-10-10 00:09:15

标签: django django-models django-urls

也许我错过了一些东西,但是根据django docs(1.2),我已经完全按照指定设置了我的URLS模型,以确保我不会为get_absolute_url返回的硬编码网址。

这就是我所拥有的:

在urls.py中

urlpatterns = patterns('django.views.generic.list_detail',
    url(r'^$','object_list',
            { 'queryset': product.objects.all(),
            'template_name': 'products/list.html',
            },
            name='product_list'),  
    url(r'^(?P<slug>[-\w]+)/$','object_detail',
            { 'queryset': product.objects.all(),
            'template_name': 'products/detail.html',
            },
            name='product_detail'), 
)

在models.py

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

该方法在模板中返回一个空字符串,并从shell中返回错误。

NoReverseMatch: Reverse for 'product_detail' with arguments '()' and keyword arguments '{'slug': 'dd-d--'}' not found.

如果没有,这应该解决,因为urls.py有一个名称: product_detail

2 个答案:

答案 0 :(得分:2)

语法似乎是正确的,你确定你的urls.py包含在内吗?尝试在视图代码中单步调试并首先使用 reverse 函数生成URL。

我的盲目猜测是,你的urls.py文件通常有问题。

答案 1 :(得分:1)

尝试更改此行:

url(r'(?P<slug>[-\w]+)/^$','object_detail',

url(r'^(?P<slug>[-\w]+)/$','object_detail',

Carret(^)代表该行的开头,因此在您编写它的上下文中它是不合逻辑的,因为这意味着该行甚至在它开始之前都有内容。