【发布时间】:2018-04-28 02:59:57
【问题描述】:
我想要的是在 Django 上创建“下一篇文章”和“上一篇文章”。到目前为止,我设法将按钮链接到主键位于当前帖子上方或下方的页面:
<a class="btn btn-default" href="{% url 'post_detail' slug=post.slug pk=post.pk|add:'1' %}">Next</a>
有两个问题:一个是 Slug 和 URL,另一个是按钮的显示(或隐藏)。
当我单击下一步时,我会转到下一个帖子(如果存在。如果不存在,我会收到一条错误消息,告诉我这样的页面不存在)。网址和上一篇一样,对应:如果我点击三下,显示的网址将是第二个帖子的网址。我想要的是以某种方式也显示相应的 slug。
第二个问题,如果之前或之后没有帖子,我想禁用按钮。但是下面这段代码:
{% if post.pk|add:'1' %}
到目前为止,这是我想出的。但显然它会检查这样的数字是否存在,而不是帖子是否存在。
该页面的视图类如下:
class PostDetailView(HitCountDetailView):
model = Post
slug_field = "title"
count_hit = True
而模型是(删除与此问题无关的代码):
@python_2_unicode_compatible
class Post(models.Model, HitCountMixin):
author = models.ForeignKey('auth.User')
title = models.CharField(max_length=100, null=False, blank=False)
text = models.TextField(null=False, blank=False)
slug = models.SlugField(max_length=100, blank=True)
# rewrite save method
def save(self, *args, **kwargs):
if not self.id:
self.slug = slugify(self.title)
super(Post, self).save(*args, **kwargs)
def article_pre_save(signal, instance, sender, **kwargs):
instance.slug = slugify(instance.title)
signals.pre_save.connect(article_pre_save, sender="blog.Post")
# go to post page
def get_absolute_url(self):
return reverse("post_detail", kwargs={'slug':self.slug, 'pk':self.pk})
# retorna o título do post
def __str__(self):
return self.title
以及相关的网址:
url(_(r'^post/(?P<pk>\d+)-(?P<slug>[-\w]+)/$'), views.PostDetailView.as_view(), name='post_detail'),
我该怎么做呢?我考虑过编写一个原始 SQL 查询(我也遇到过这个问题,但那是另一回事),但到目前为止,我不知道如何将它实际链接到模板。提前感谢您的帮助和关注。
【问题讨论】:
-
在
pk中添加或减去 1不是 一个好方法,因为它们之间可能会删除帖子(因此不存在 ID)。更好的方法是将视图中的上一篇和下一篇 objects(通过按日期排序的查询)传递给模板。或者,您可以将next_post和prev_post方法添加到您的Post模型中。
标签: django templates primary-key slug