Django ограничивает следующий пост и предыдущий пост в представлении подробностей только активными
В настоящее время у меня есть представление модели в таком виде
from django.db import models
from django.contrib.auth.models import User
from django.utils import timezone
STATUS = (
(0,"Draft"),
(1,"Publish")
)
class Post(models.Model):
title = models.CharField(max_length=200, unique=True)
slug = models.SlugField(max_length=200, unique=True)
author = models.ForeignKey(
User, on_delete=models.CASCADE, related_name="blog_posts"
)
updated_on = models.DateTimeField(auto_now=True)
content = models.TextField()
created_on = models.DateTimeField(auto_now_add=True)
status = models.IntegerField(choices=STATUS, default=0)
class Meta:
ordering = ["-created_on"]
def __str__(self):
return self.title
def get_absolute_url(self):
from django.urls import reverse
return reverse("post_detail", kwargs={"slug": str(self.slug)})
и мое представление выглядит следующим образом
class PostDetail(DetailView):
model = Post
template_name = 'post_detail.html'
и мой шаблон выглядит так
<ul class="text-center">
{% if post.get_previous_by_created_on_active %}
<li class="prev">
<a rel="next" href="{{ post.get_previous_by_created_on.get_absolute_url}}">
{{ post.get_previous_by_created_on_active}}</a>
</li>
{% endif %}
{% if post.get_next_by_created_on %}
<li class="next">
<a rel="next" href="{{ post.get_next_by_created_on.get_absolute_url}}">
{{ post.get_next_by_created_on}}
</a>
</li>
</ul>
Есть ли способ передать status == 1
в get_next_by_created_on
, чтобы всегда отображался следующий активный пост, а не следующий черновик?
Вы можете определить два дополнительных метода в модели Post
для получения только активных элементов:
class Post(models.Model):
# ⋮
def get_previous_by_created_on_active(self):
return self.get_previous_by_created_on(status=1)
def get_next_by_created_on_active(self):
return self.get_next_by_created_on(status=1)
Таким образом, будут искаться только Post
с status=1
(поэтому публикуются Post
объекты).