当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Python Django Model.get_absolute_url用法及代码示例


本文介绍 django.db.models.Model.get_absolute_url 的用法。

声明

Model.get_absolute_url()

定义 get_absolute_url() 方法来告诉 Django 如何计算对象的规范 URL。对于调用者,该方法应该返回一个字符串,该字符串可用于通过 HTTP 引用该对象。

例如:

def get_absolute_url(self):
    return "/people/%i/" % self.id

尽管此代码正确且简单,但它可能不是编写此类方法的最可移植的方式。 reverse() 函数通常是最好的方法。

例如:

def get_absolute_url(self):
    from django.urls import reverse
    return reverse('people-detail', kwargs={'pk' : self.pk})

Django 使用get_absolute_url() 的地方之一是在管理应用程序中。如果对象定义了此方法,object-editing 页面将有一个 “View on site” 链接,该链接将直接跳转到对象的公共视图,如 get_absolute_url() 所示。

类似地,Django 的一些其他位,例如联合提要框架,在定义时使用get_absolute_url()。如果你的模型实例每个都有一个唯一的 URL 是有意义的,你应该定义 get_absolute_url()

警告

您应该避免从未经验证的用户输入构建 URL,以减少链接或重定向中毒的可能性:

def get_absolute_url(self):
    return '/%s/' % self.name

如果 self.name'/example.com' 这将返回 '//example.com/' ,它又是一个有效的架构相对 URL,但不是预期的 '/%2Fexample.com/'

最好在模板中使用get_absolute_url(),而不是hard-coding 对象的 URL。例如,这个模板代码很糟糕:

<!-- BAD template code. Avoid! -->
<a href="/people/{{ object.id }}/">{{ object.name }}</a>

这个模板代码要好得多:

<a href="{{ object.get_absolute_url }}">{{ object.name }}</a>

这里的逻辑是,如果您更改对象的 URL 结构,即使是为了更正拼写错误之类的小事,您也不希望必须跟踪可能创建 URL 的每个位置。在get_absolute_url() 中指定一次,然后让所有其他代码调用该位置。

注意

您返回的字符串get_absolute_url() 必须仅包含 ASCII 字符(URI 规范要求,RFC 2396#section-2) 并在必要时进行 URL 编码。

调用get_absolute_url() 的代码和模板应该能够直接使用结果而无需任何进一步处理。如果您使用的字符串包含 ASCII 范围之外的字符,您可能希望使用 django.utils.encoding.iri_to_uri() 函数来帮助解决此问题。

相关用法


注:本文由纯净天空筛选整理自djangoproject.com大神的英文原创作品 django.db.models.Model.get_absolute_url。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。