在Django框架中,模型可以定义get_absolute_url()
方法。该方法用于为模型实例创建url,并且定义和使用此方法被认为是一种很好的做法。
即使生成的网址不是唯一的,定义此方法仍然是一种好习惯吗?
示例:
class Project(models.Model):
name = models.CharField(max_length=128)
def get_absolute_url(self):
return reverse('xxx:project_details', args=(self.id,))
class Item(models.Model):
project = models.ForeignKey(Project, on_delete=models.CASCADE)
name = models.CharField(max_length=128)
def get_absolute_url(self):
return reverse('xxx:project_details', args=(self.project.id,))
当前,Item
实例只能在project_details
页面上的列表中看到,我打算保持这种状态。 get_absolute_url()
方法返回项目详细信息URL。这意味着同一项目的所有项目都返回相同的URL。这样可以吗?我发现它很有用,因为某些通用视图使用get_absolute_url()
并自动重定向到正确的页面。但是,我是Django的新手,想知道这是否以后会引起问题。
答案 0 :(得分:2)
简短的答案:我建议不这样做。通常,get_absolute_url
链接到该对象的“唯一标识符”。
即使生成的网址不是唯一的,定义此方法仍然是一种好习惯吗?
get_absolute_url(..)
[Django-doc]上的文档中提到:
定义一个
get_absolute_url()
方法来告诉Django如何计算 对象的规范网址。对于呼叫者,此方法应 似乎返回一个字符串,该字符串可用于引用对象 HTTP。(...)
类似地,Django的其他一些地方,例如联合组织 feed框架,请在定义时使用
get_absolute_url()
。如果它 对于模型的实例,每个实例都有一个唯一的网址是很有意义的, 您应该定义get_absolute_url()
。
在数学和计算机科学中,canonical form [wiki]表示:
(...)“规范”形式和“常规”形式之间的区别因子字段而异。在大多数字段中,规范形式为每个对象指定唯一的表示形式,而常规形式只是简单地指定其形式,而无需唯一性。 (...)
因此,这表明get_absolute_url
如果生成的URL是唯一的,则更有意义。毕竟,get_absolute_url
旨在显示该特定对象的详细信息。您可以将其用于redirect(some_object)
等
尽管当然不会引发错误,但是使用get_absolute_url
链接到 parent 对象的详细信息页面并不是很常见。
如果继续,可以将其实现为:return self.project.get_absolute_url(..)
而不是实现相同的reverse(..)
逻辑,因为如果以后更改项目的get_absolute_url
,则{{1 }}的项目也会被更新。