43

Django中的@permalink和是什么?get_absolute_url何时以及为何使用它?

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

4

4 回答 4

93

截至 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,))

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

url(r'^(?P<slug>[-\w\d\_]+)/$',
    MyModelDetailView.as_view(),
    name='mymodel_detail'),
于 2013-05-01T16:49:38.147 回答
39

@permalink是 python装饰器get_absolute_url而是 django 模型上的方法。

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

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

如果您阅读有关该主题的文档,您将了解它们之间的关系。装饰器挂钩到 django的URLconf 的后端,允许您使用命名的 url 模式@permalink编写更便携的代码。这比单独使用更可取:您的代码变得更加干燥,因为您不必指定路径。get_absolute_url

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

    @permalink
    def get_absolute_url(self):
        return ("blog-detail", [self.slug,])

并在 urls.py

    ...
    url(r'/blog/(?P<slug>[-w]+)/$', blog.views.blog_detail, name="blog-detail")
于 2012-11-21T23:54:11.890 回答
4

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

来源

于 2019-08-13T21:13:38.477 回答
0

更好的方法是在 urls.py 中为您的应用程序声明一个名称,然后引用它而不是硬编码任何内容:

在 urls.py 中:

app_name = 'my_app'

urlpatterns = [
    path('blogs/<int:slug>', blog.views.blog_detail, name='mymodel_detail'),
    ]

在models.py中:

from django.urls import reverse


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

    def get_absolute_url(self):
        return ('my_app:mymodel_detail, args=[self.slug,])
于 2020-01-05T16:04:18.803 回答