这个主题是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?
答案 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 }}
。