【问题标题】:Difference between using url tag and get_absolute_url使用 url 标签和 get_absolute_url 的区别
【发布时间】:2017-09-18 02:46:06
【问题描述】:

如果我有这样的模型:

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 映射:

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 必须是字符串?

在我的一般视图中,我如何使用 pk 变量? 我真的很困惑slug_fieldslug_url_kwargpk_url_kwargquery_pk_and_slug

哪个匹配哪个?

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

【问题讨论】:

    标签: django


    【解决方案1】:

    在我看来,使用

     <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是数据库中的一个唯一字段(您在模型定义中指定它)代表一个蛞蝓场。当您更喜欢 /article/giannis-antetokounmpo-is-the-best 而不是 /article/404 等更具可读性 (seo) 的 URL 时,使用 Slug。

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

    【讨论】:

    • 关于最后一个问题,我只是说我不知道​​如何在通用视图中使用 。在基于函数的视图中很简单,只需将其指定为 arg:def view(request, pk) 并使用它来获取数据库中的文章,例如:article = Article.objects.get(pk=pk)。我不明白这在基于类的视图中是如何工作的。我必须提供一个slug_field = pkpk_url_kwarg = pk,这样django就知道Article.objects.get(slug_field=pk_url_kwarg)或者这是怎么工作的?
    • query_pk_and_slug 是做什么的?检查是否有slug_url_kwarg,如果没有,则检查pk_url_kwarg
    【解决方案2】:

    url tag 将执行 reverse 操作并生成一个 url 路径,其中 get_absolute_url 应在模型中定义,因为这是获取特定对象的 url。

    Here is a post解释get_absolute_url

    【讨论】:

    • 我知道它的作用,我想知道哪种方法最好。谢谢。
    • 在应用程序生命周期中,url 甚至模型都可能随时更改,这就是为什么在 Django 中引入了避免在应用程序reverse 中随处更改 url(硬编码)的原因。这样只要 url 的用途没有改变,我们就不用担心改变 url 的名称。在您的情况下,似乎不需要使用 get_absolute_url 作为 url 标签就可以满足您的用例,而不会使您的应用程序变得复杂。 【简单胜于复杂,复杂胜于复杂——来自Python之禅】
    • @SathishKumarVG 我相信这可以使用另一个讨论,因为我没有看到使用 url 标签而不是 get_absolute_url 的好处。要使 get_absolute_url 起作用,无论如何您很可能都使用反向(...我假设)。这意味着您没有使用硬编码的 url,而是在执行与 url 标签完全相同的操作,但您省去了在模板中写出该 url 标签所需参数的麻烦。因此 get_absolute_url 对我来说似乎是更清洁的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-24
    • 2021-03-07
    • 2019-09-23
    • 2020-09-28
    • 2014-01-31
    • 2021-08-27
    • 2013-08-20
    相关资源
    最近更新 更多