使用 url 标签和 get_absolute_url 的区别

yie*_*tem 6 django

如果我有这样的模型:

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)])
Run Code Online (Sandbox Code Playgroud)

我有一个这样的网址映射:

url(r'^article/(?P<pk>[0-9]+)/$', views.ArticleView.as_view(), name='article-detail'),
Run Code Online (Sandbox Code Playgroud)

在模板中我应该使用:

<a href="{{ article.get_absolute_url }}">{{ article.title }}</a>
Run Code Online (Sandbox Code Playgroud)

或者

<a href="{% url 'article-detail' article.pk %}">{{ article.title }}</a>
Run Code Online (Sandbox Code Playgroud)

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

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

在我的通用视图中,如何使用 pk 变量?我真的与迷茫slug_fieldslug_url_kwargpk_url_kwargquery_pk_and_slug

哪个匹配哪个?

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

小智 6

在我看来,使用

 <a href="{{ article.get_absolute_url }}">{{ article.title }}</a>
Run Code Online (Sandbox Code Playgroud)

是更好的做法。如果稍后您想要更改此资源的 url,您将在模型函数中执行一次,并且您不会搜索每个模板页面以引用此特定 url。这背后的哲学是,文章的 url 是属于文章模型的资源(django:胖模型和瘦控制器?

更好的方法是写

return reverse('article-detail', kwargs={'pk': self.pk})
Run Code Online (Sandbox Code Playgroud)

这样,当您的网址中有多个参数时,您每次都知道每个参数的值(*args 和 **kwargs?

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

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