如果我有这样的模型:
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_field
,slug_url_kwarg
,pk_url_kwarg
,query_pk_and_slug
。
哪个匹配?
如果我将query_pk_and_slug
设为True,slug_field
= pk?
答案 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