【问题标题】:"Next" and "Previous" button on Django, on posts with SlugsDjango 上的“下一个”和“上一个”按钮,在带有 Slugs 的帖子上
【发布时间】: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


【解决方案1】:

django-next-prev 参考这个。它很好地满足了这些要求。这个包将为您提供当前对象的下一个和上一个对象。之后,您必须在 Django 中使用 reverse 或 reverze_lazy 方法构建下一个和上一个 URL

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-08
    • 2020-11-09
    • 1970-01-01
    • 1970-01-01
    • 2016-05-31
    • 1970-01-01
    相关资源
    最近更新 更多