【问题标题】:When to use Django get_absolute_url() method?何时使用 Django get_absolute_url() 方法?
【发布时间】:2017-08-28 00:56:10
【问题描述】:

Django 文档说:

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

规范 URL 在此上下文中的含义是什么?

从 SEO 的角度来看,我知道规范 URL 意味着从外观相似的 URL(example.comexample.com/index.html)中选择最佳 URL。但是这个意思不适合这个语境。

我知道这个方法在 Django 管理、重定向等中提供了一些额外的功能。而且我完全知道如何使用这个方法。

但它背后的哲学是什么?我从来没有在我的项目中真正使用过它。它有什么特殊用途吗?

【问题讨论】:

    标签: python django


    【解决方案1】:

    get_absolute_url 允许保持你的对象干燥。拥有一个定义该对象实例的 url。在大多数情况下,该对象的详细信息页面。

    将此与models.permalink 结合使用,您可以非常轻松地定义对象详细信息的url。

    What is @permalink and get_absolute_url in Django?

    以后如果你改变了 url 的结构,你只需要在一个地方修改,urls。

    【讨论】:

    • 我知道从 seo 的角度来看,规范的 url 意味着从相似的 url(example.com、example.com/index.html)中选择最好的 url。但是这个意思不适合这个语境。
    • 我很惊讶,因为这是我第一次读到关于 @permalink 装饰器的东西。实际上,它不再被记录在案,现在可能已被弃用。见stackoverflow.com/a/16322584/1887976
    【解决方案2】:

    首先,当涉及到 Web 开发时,您确实希望避免在模板中使用硬编码路径。这样做的原因是路径可能会改变,并且遍历所有 HTML 和模板以查找每个 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 中,例如:

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

    在这里,我们在 3 个不同的 URL 中显示了相同的资产。 “规范 URL”将是我们定义为主要 URL 的那个。例如。 /en/shoes/1-nike-shoes/.

    定义某个资产的官方或“主要”URL 是非常有用的。它可以让您在搜索引擎索引您的网站时防止重复内容。

    在您使用的 Django 文档中引用的上下文中。在这种情况下,“Canonical”是指“显示此模型的官方 URL”。

    【讨论】:

      【解决方案3】:

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

      这里get_absolute_url 出现在图片中。它告诉 django 在创建新帖子时去哪里。

      【讨论】:

        【解决方案4】:

        看这个例子:

        我想为每个产品生成一个唯一的 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 - 我的网址格式

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-10-12
          • 2012-04-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-08-26
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多