如果我有这样的模型:
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_field
,slug_url_kwarg
,pk_url_kwarg
,query_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 试图找到唯一要返回的对象的所有方法。您必须通过指定适当的变量来选择一个。
归档时间: |
|
查看次数: |
954 次 |
最近记录: |