何时应使用Django的get_absolute_url()方法?

49

Django文档中提到:

get_absolute_url() 方法用于告诉Django如何计算对象的规范URL。

在这个上下文中,什么是规范URL的意思?

从SEO的角度来看,我知道规范URL指的是从类似的URL(example.comexample.com/index.html)中选择最佳URL。但是这个意思不适用于这个上下文。

我知道这个方法在Django admin中提供了一些附加功能,例如重定向等。而且我完全知道如何使用这个方法。

但是它背后的哲学是什么?我实际上从未在我的项目中使用过它。它有任何特殊目的吗?

4个回答

85

首先,在网站开发中,您确实希望避免在模板中硬编码路径。原因是路径可能会更改,如果要手动查找每个URL或路径并进行更新,这将是一件麻烦的事情。这会使您的代码难以维护。

解决方案是定义返回URL的函数。这就是get_absolute_url()的作用。

例如:

<!-- Bad -->
<a href="/language/category/product/{{product.pk}}">Link</a>

<!-- Good -->
<a href="{{product.get_absolute_url}}">Link</a>

规范化URL

您的第二个问题是什么是规范化URL。规范化URL是指某个页面的“官方”网址。有时,一个资源可以在多个不同的URL中显示,例如:

/en/shoes/1-nike-shoes/
/en/shoes/1-nike-shoes?sort=price&order=asc
/en/shoes/1-nike-shoes?sort=price&order=desc

这里有同一资产在三个不同的URL中显示。"规范URL"将是我们定义的主要URL,例如:/en/shoes/1-nike-shoes/

定义某个资产的官方或者"主要"URL非常有用。这将允许您在搜索引擎索引您的网站时防止重复内容。

在您从Django文档中引用的语境中,“规范”的意思是“此模型显示的官方URL”。


23

看这个例子:

我想为每个产品生成一个唯一的URL,模式将是 - http://...../products/abcdefg/(在“/products/”后面是我的slug值)。

在models.py中,我创建了'get_absolute_url',它将按上述模式生成URL。

models.py

class Products(models.Model):
    title = models.CharField(max_length=120)
    slug = models.SlugField(blank=True, unique=True)
    description = models.TextField()

    def get_absolute_url(self):
        return f"/products/{self.slug}/"

productlist.html - 在锚标签中使用了get_absolute_url

{% for obj in object_list  %}
   <a href="{{obj.get_absolute_url}} ">{{obj.title}}</a> <br>
{% endfor %}

urls.py - 我的 URL 模式

 path('/products/<slug>/', ProductDetails.as_view()),

11

您要为您的网站创建模型。当为模型创建新实例时,Django 必须知道在创建新帖子或新实例时去哪里。

这就是 get_absolute_url 的作用。它告诉 Django 在创建新帖子时应该去哪里。


5
get_absolute_url允许您保持对象DRY(不重复自己)。它可以定义该对象实例的URL。在大多数情况下,这是用于该对象的详细页面。
结合models.permalink使用,您可以非常轻松地定义对象详细URL。
参考:What is @permalink and get_absolute_url in Django? 稍后如果您要更改url的结构,只需在一个位置修改即可,那就是urls.py文件中。

我知道从SEO的角度来看,规范URL意味着从类似的URL中选择最佳的URL(例如example.com,example.com/index.html)。但是这个意思在这个上下文中并不适用。 - Cody
2
我很惊讶,因为这是我第一次读到有关@permalink装饰器的内容。实际上,它现在已经没有文档支持了,可能已经被弃用。请参见https://dev59.com/82Yr5IYBdhLWcg3wpbyQ#16322584。 - Antwane

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接