使用url标记和get_absolute_url

时间:2017-04-21 07:50:24

标签: 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)])

我有这样的网址映射:

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转换为字符串?网址必须是字符串吗?

在我的通用视图中,如何使用pk变量? 我真的很混淆slug_fieldslug_url_kwargpk_url_kwargquery_pk_and_slug

哪个匹配?

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

2 个答案:

答案 0 :(得分:2)

在我看来,使用

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

是更好的做法。 如果稍后要更改此资源的URL,则在模型函数中执行一次,并且不会搜索每个模板页面以引用此特定URL。 这背后的哲学是,文章的网址是属于文章模型的资源(django: Fat models and skinny controllers?

更好的方法是写

return reverse('article-detail', kwargs={'pk': self.pk})

这样,当你的网址中有多个args时,你就会知道每次arg的值(*args and **kwargs?

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

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

答案 1 :(得分:1)

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

Here is a post解释get_absolute_url