Django中的@permalink和get_absolute_url是什么?

Django中的@permalink和get_absolute_url是什么?,django,Django,Django中的@permalink和获取绝对url是什么?何时和为什么使用它 请给出一个非常简单的例子(一个实际的例子)。谢谢@permalink是一种python,而get\u absolute\u url是django模型上的一种方法 两者都涉及允许您反转特定对象的URL,应该一起使用。当您需要提供指向特定对象的链接或希望向用户显示该对象的特定URL(如果有)时,可以随时使用它们 您可以简单地编写get\u absolute\u url方法来返回硬编码字符串,但这不符合Django的DRY

Django中的
@permalink
获取绝对url
是什么?何时和为什么使用它


请给出一个非常简单的例子(一个实际的例子)。谢谢

@permalink
是一种python,而
get\u absolute\u url
是django模型上的一种方法

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

您可以简单地编写
get\u absolute\u url
方法来返回硬编码字符串,但这不符合Django的DRY哲学(不要重复)。取而代之的是
@permalink
,使事情更加灵活

如果你阅读,你会看到他们之间的关系。
@permalink
decorator钩住django的URLconf后端,允许您通过使用编写更可移植的代码。这比单独使用
get_absolute\u url
更可取:您的代码变得更加枯燥,因为您不必指定路径

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

    @permalink
    def get_absolute_url(self):
        return ("blog-detail", [self.slug,])
和在url.py中

    ...
    url(r'/blog/(?P<slug>[-w]+)/$', blog.views.blog_detail, name="blog-detail")
。。。
url(r'/blog/(?P[-w]+)/$”,blog.views.blog_detail,name=“blog detail”)

截至2013年,Django文档不鼓励使用permalink decorator,并鼓励在get\u absolute\u url方法主体中使用reverse()。到2015年,permalink decorator似乎在Django文档中消失得无影无踪,最终在2018年消失

因此,对于创建单个对象视图的永久链接的标准干式方法,请在模型中使用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,))
然后在URL.py中有一个指向您的视图的条目:

url(r'^(?P<slug>[-\w\d\_]+)/$',
    MyModelDetailView.as_view(),
    name='mymodel_detail'),
url(r'^(?P[-\w\d\\\\\\+)/$,
MyModelDetailView.as_view(),
name='mymodel_detail'),
在Django 2.1中 django.db.models.permalink()修饰符被删除


更好的方法是在URL.py中声明应用程序的名称,然后引用该名称,而不是硬编码:

在URL.py中:

app\u name='my\u app'
URL模式=[
路径('blogs/',blog.views.blog_detail,name='mymodel_detail'),
]
在models.py中:

从django.url反向导入
类BlogPost(models.Model):
name=modelsCharField()
slug=型号。SlugField(…)
def get_绝对_url(自身):
return('my_app:mymodel_detail,args=[self.slug,]))

在Django 2.0中,
reverse
应该从
Django.url
导入,否则您会得到一个
ModuleNotFoundError
。那么,我应该从哪个包导入permalink装饰器呢?@permalink从1.11开始就不推荐使用了。相关文件