我有这个模型:
class Book(models.Model):
title = models.CharField(max_length=200)
author = models.ForeignKey('Author', on_delete=models.SET_NULL, null=True)
summary = models.TextField(max_length=600)
isbn = models.CharField('ISBN', max_length=13, unique=True)
genre = models.ManyToManyField(Genre)
language = models.ForeignKey(
'Language', on_delete=models.SET_NULL, null=True)
def __str__(self):
return self.title
def get_absolute_url(self):
return reverse("book_detail", kwargs={"pk": self.pk})
这个观点:
class BookDetail(DetailView):
model = Book
它将我连接到模板以及所谓的(book_detail.html
)。
我的问题是,在这种情况下,我还需要在应用程序的urls.py
中指定url路径吗?
path('book/<int:pk>/',views.BookDetail.as_view(),name='book_detail')
我以为如果我使用get_absolute_url(self)
我就不需要这样做,但我发现一些资源说它是necessary。我觉得这很混乱,因为对我来说,这感觉就像重复代码。
谢谢!
1条答案
按热度按时间50few1ms1#
我的问题是,在这种情况下,我还需要在应用程序的www.example.com中urls.py指定url路径吗?
是,
get_absolute_url
* 不 * 创建URL条目。.get_absolute_url()
[Django-doc]是一个可以放在模型类(或者任何你想要的类)上的方法。Django在 * 检查 * 模型时对它不是很感兴趣,所以这并不重要。基本上有两种使用情况,这是有用的:当重定向到模型对象时,以及在模板中。
实际上,当你使用**
redirect(…)
[Django-doc]时,你可以传递一个模型对象,其中模型有一个.get_absolute_url()
方法。在这种情况下,它将调用.get_absolute_url()
并向该路径返回HttpResponseRedirect
。这在一些基于类的视图中也很有用,比如当创建或更新成功时,CreateView
[Django-doc]或UpdateView
[Django-doc]重定向。您可以指定success_url
或get_success_url
来指定视图应重定向到的位置。但是如果你没有指定这个,并且模型有一个.get_absolute_url()
方法,它将重定向到创建或更新的对象的.get_absolute_url()
的结果。这是一个流行的用例:如果你写了一篇博客文章,一个明智的做法是在它创建后,重定向到该文章的页面。另一个用例是在模板中使用它,它可以防止手动构建路径,或者使用
{% url … %}
**模板标记[Django-doc]。因此,您可以通过以下内容链接到博客文章:因此,这只是一个简单的函数,它确定了一个绝对路径到一个 canonical 视图,以显示博客文章,个人资料,或类似的东西。它没有附加用于创建视图或路径的触发器。
我以为如果我使用
get_absolute_url(self)
我就不需要这样做了,但我发现一些资源,它说这是必要的。我觉得这很混乱,因为对我来说,这感觉就像重复代码。否,您只需说在哪里可以找到该对象的规范视图,因此,将确定查看博客文章的URL的方法。但它并没有说太多关于路径的结构。这种逻辑发生在URL中。寻找
get_absolute_url
并基于此创建url模式可能是个坏主意:这将意味着路径在模型中是“隐藏的”,因此开发人员可能忽略这些,并且因此这些视图将做什么以及这些视图将指向什么视图函数或基于类的视图将是不太透明的。