Django中的@permalink和get_absolute_url是什么?

use*_*831 41 django

什么是@permalinkget_absolute_urlDjango?何时以及为何使用它?

请一个非常简单的例子(一个真实的例子).谢谢

Mar*_*ian 85

截至2013年,Django文档不鼓励使用永久链接装饰器,并鼓励在get_absolute_url方法的主体中使用reverse().到2015年,永久链接装饰器似乎已经消失,没有来自Django文档的痕迹,最终在2018年的Django 2.1版本删除了它.

因此,对于创建指向单个对象视图的永久链接的标准DRY方式,请在模型中使用get_absolute_url(),如下所示:

from django.db import models
from django.urls import reverse
#  NOTE: pre Django 1.10+ this is "from django.core.urlresolvers import reverse"


class MyModel(models.Model):
    slug = models.SlugField()

    def get_absolute_url(self):
        return reverse('mymodel_detail', args=(self.slug,))
Run Code Online (Sandbox Code Playgroud)

然后在urls.py中有一个指向您的视图的条目:

url(r'^(?P<slug>[-\w\d\_]+)/$',
    MyModelDetailView.as_view(),
    name='mymodel_detail'),
Run Code Online (Sandbox Code Playgroud)

  • 在Django 2.0中,应该从django.urls中导入“ reverse”,否则会得到“ ModuleNotFoundError”。 (2认同)

Tim*_*ony 35

@permalink是一个python 装饰器,而get_absolute_urldjango模型是一个方法.

两者都涉及允许您反转特定对象的URL,并且应该一起使用.它们可以在您需要提供指向特定对象的链接时使用,或者希望将该对象的特定URL(如果有)显示给用户

你可以简单地编写你的get_absolute_url方法来返回一个硬编码的字符串,但这不符合Django的DRY哲学(不要重复自己).相反,有@permalink使事情更灵活.

如果您阅读有关该主题的文档,您将看到它们之间的相互关系.该@permalink装饰挂接到Django的URL配置的后端,允许您使用写更多的可移植的代码名为url模式.这比仅仅使用get_absolute_url它更好:你的代码变得很干,因为你不必指定路径.

class BlogPost(models.Model):
    name = modelsCharField()
    slug = models.SlugField(...)

    @permalink
    def get_absolute_url(self):
        return ("blog-detail", [self.slug,])
Run Code Online (Sandbox Code Playgroud)

并在urls.py

    ...
    url(r'/blog/(?P<slug>[-w]+)/$', blog.views.blog_detail, name="blog-detail")
Run Code Online (Sandbox Code Playgroud)

  • @permalink 从 1.11 开始弃用。相关文档 https://docs.djangoproject.com/en/2.2/releases/1.11/#features-deprecated-in-1-11 (5认同)

C.K*_*.K. 5

在 Django 2.1 中,删除了 django.db.models.permalink() 装饰器。

来源