反转url通用视图

时间:2011-06-12 12:45:25

标签: django django-urls

这个主题是this topic中思想的延续。我在通用视图中倒退了反向问题。上次我认为它没有反向匹配,因为我使用了很多对很多,现在我没有多少与***关系相反,但问题仍在那里。由于我在两种情况下都在URL中有通用视图,我建议问题在于通用视图而没有视图功能。  起初我在模型

中使用了@permalink装饰器
...
@permalink
def get_absolute_url(self):
    return ('categories', str(self.id))
...
@permalink
def get_absolute_url(self):
    return ('pages', (), {'page_name': self.human_readable_url})

网址

url(r'^(?P<page_name>&\w*)?/?$', direct_to_template,
    {'template': 'basic.djhtml'},
    name = "pages"),
url(r'cat/\d+/$',
    direct_to_template,
    {'template': 'basic.djhtml'},
    name = "categories")

出了错误:

  

NoReverseMatch:反向找不到参数'()'和关键字参数'{'page_name':u'page1'}'的'pages'。

然后我尝试了反向方法

def get_absolute_url(self):
    return reverse('categories', args = [self.id, ])

并有同样的错误

  

NoReverseMatch:反向找不到参数'(2,)'和关键字参数'{}'的'categories'。

基于永久链接没有明确使用反向方法的事实,我认为问题在于url中的交互反向和通用视图。为什么会这样?如何在url通用视图中使用reverse?

1 个答案:

答案 0 :(得分:1)

问题是,您已将名称categories赋予通用视图direct_to_template,并且您正在将参数传递给该视图 - 但direct_to_template不接受该参数,只有包含额外背景的字典。

如果要将其他参数传递给通用视图,可以 - 但它们只会传递给模板。您可以extend the view编写自己的函数,将函数添加到字典中,然后调用通用视图。像这样:

# views.py
from django.views.generic.simple import direct_to_template

def my_view(id):
    more_data = {'id': id}
    return direct_to_template(template = 'basic.djhtml', more_data)

然后在urls.py中,将direct_to_template替换为my_view。由于my_view采用id参数,reverse将正确匹配,参数将传递到通用视图,并传递到模板。

据推测,模板中的某个位置是{{ id }}