【发布时间】:2012-11-21 23:20:02
【问题描述】:
Django 中的@permalink 和get_absolute_url 是什么?何时以及为什么使用它?
请举一个非常简单的例子(一个真正的实际例子)。谢谢
【问题讨论】:
标签: django
Django 中的@permalink 和get_absolute_url 是什么?何时以及为什么使用它?
请举一个非常简单的例子(一个真正的实际例子)。谢谢
【问题讨论】:
标签: django
截至 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'),
【讨论】:
reverse 应该从 django.urls 导入,否则你会得到一个 ModuleNotFoundError。
@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")
【讨论】:
在 Django 2.1 中 django.db.models.permalink() 装饰器被移除。
【讨论】:
更好的方法是在 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,])
【讨论】: