gpt4 book ai didi

django - 使用 url 标签和 get_absolute_url 的区别

转载 作者:行者123 更新时间:2023-12-01 13:35:39 26 4
gpt4 key购买 nike

如果我有这样的模型:

class Article(models.Model):
title = models.CharField(max_length=200)
# ... rest of the code ...

def get_absolute_url(self):
return reverse('article-detail', args=[str(self.pk)])

我有一个这样的网址映射:
url(r'^article/(?P<pk>[0-9]+)/$', views.ArticleView.as_view(), name='article-detail'),

在模板中我应该使用:
<a href="{{ article.get_absolute_url }}">{{ article.title }}</a>

或者
<a href="{% url 'article-detail' article.pk %}">{{ article.title }}</a>

我仍然认为这两个都是好主意,但哪个是最好的?

在我写的第一个代码中 args=[str(self.pk)] ,为什么我必须将self.pk 转换成字符串? URL 必须是字符串吗?

在我的通用 View 中,如何使用 pk 变量?
我真的很困惑 slug_field , slug_url_kwarg , pk_url_kwarg , query_pk_and_slug .

哪个匹配哪个?

如果我设置 query_pk_and_slug为真, slug_field = pk?

最佳答案

在我看来,使用

 <a href="{{ article.get_absolute_url }}">{{ article.title }}</a>

是更好的做法。
如果以后你想改变这个资源的 url,你会在你的模型函数中做一次,你不会搜索每个模板页面来引用这个特定的 url。
这背后的理念是,文章的 url 是属于文章模型的资源 ( django: Fat models and skinny controllers? )

更好的方法是写
return reverse('article-detail', kwargs={'pk': self.pk})

这样,当您的 url 中有多个 args 时,您每次都知道每个 arg 的值 ( *args and **kwargs? )

我不确定你问题的最后一部分。总而言之, pk 代表主键,默认情况下(并保持原样)是 id(由您的数据库自动生成),而 slug 是数据库中的唯一字段(您在模型定义中指定),表示一个 SlugField。当您更喜欢/article/giannis-antetokounmpo-is-the-best 等更具可读性的 (seo) url 而不是/article/404 时,可以使用 Slug。

要了解基于类的 View 如何在 Django 中工作(比基于函数更好的实践),请查看 https://ccbv.co.uk/projects/Django/1.10/django.views.generic.detail/DetailView/例如。
当GET(调用http方法)时,结果调用了模型的get函数。如果您注意到,有一个 self.get_object() 函数。在 get_object() 的定义中,您可以看到您正在搜索的逻辑。具体来说,在评论中,你可以看到所有的方式,即 View 试图找到唯一一个返回的对象。您必须通过指定适当的变量来选择一个。

关于django - 使用 url 标签和 get_absolute_url 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43536933/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com