为什么在models.py中定义了get_absolute_url()?

时间:2014-11-05 05:28:28

标签: python django generics

我正在尝试使用基于类的视图(CBV)重做我的应用视图,并偶然发现这个函数get_absolute_url()在models.py中定义,generic editing views

我已创建模型,之前从未使用过此功能。这是否特定于CBV?

1 个答案:

答案 0 :(得分:1)

它并非特定于CBV,您可以在应用程序的任何位置使用它。它使得获取模型实例的url变得更加容易,而不必使用url解析。当您可以在对象本身上调用get_absolute_url时,也可以更轻松地在模板中获取对象的确定URL。例如,如果要循环遍历对象列表:

{% for post in blog_posts %}
    <a href="{{ post.get_absolute_url }}">read post</a>
{% endfor %}

也就是说,在您的视图中使用该方法并没有阻止您:

post = BlogPost.objects.get(...)
url = post.get_absolute_url()

虽然这个方法也没什么特别之处。如果您愿意,可以自己编写get_foo_url()。例如,我wrote a blog post about a get_admin_url,一种允许您将Django管理URL添加到对象的方法:

class Book(models.Model):
    ...
    def get_admin_url(self):
        content_type = ContentType \
            .objects \
            .get_for_model(self.__class__)
        return reverse("admin:%s_%s_change" % (
            content_type.app_label,
            content_type.model),
            args=(self.id,))

 # {{ book.get_admin_url }}