Django中的@permalink
和get_absolute_url
是什么?何时和为什么使用它?
请一个非常简单的例子(一个真实的例子)。感谢
答案 0 :(得分:81)
截至2013年,Django文档不鼓励使用永久链接装饰器,并鼓励在get_absolute_url方法的主体中使用reverse()。到2015年,固定链接装饰器似乎消失了而没有来自Django文档的痕迹,并且在2018年终于removed in Django version 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'),
答案 1 :(得分:34)
@permalink
是python decorator,而get_absolute_url
是django模型上的方法。
两者都涉及允许您反转特定对象的URL,并且应该一起使用。只要您需要提供指向特定对象的链接或想要向用户显示该对象的特定URL(如果有),就可以使用它们
您可以简单地编写get_absolute_url
方法来返回硬编码字符串,但这不符合Django的DRY哲学(不要重复自己)。相反,有@permalink
使事情更灵活。
如果您阅读the docs on the subject,您将会看到它们之间的关系。 @permalink
装饰器挂钩到django的URLconf的后端,允许您使用named url patterns编写更多可移植代码。这比仅使用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")
答案 2 :(得分:1)
在Django 2.1中django.db.models.permalink()装饰器已删除。
答案 3 :(得分: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,])