【问题标题】:Reverse for url generic views反向用于 url 通用视图
【发布时间】:2011-09-13 09:37:54
【问题描述】:

这个话题是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,)”和关键字参数“{}”的“类别”的反向。

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

【问题讨论】:

    标签: django django-urls


    【解决方案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 }}

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-25
      • 2015-03-30
      • 2012-11-18
      • 2023-04-06
      • 2014-11-14
      • 2011-09-10
      • 2012-01-25
      • 2016-08-22
      相关资源
      最近更新 更多