如何加载/不加载分页取决于对象是否存在?姜戈



我正在尝试使我的分页仅在页面上有帖子时才显示,并且如果管理员已批准它们,则只能有帖子。

如果没有帖子,模板上应该显示"没有要显示的帖子",如果有批准的帖子,则应显示帖子以及分页选项。

我在这里做错了什么?

models.py

from django.db import models
from django.utils import timezone
from django.contrib.auth.models import User
from django.urls import reverse

class Post(models.Model):
title = models.CharField(max_length=100)
content = models.TextField()
date_posted = models.DateTimeField(default=timezone.now)
author = models.ForeignKey(User, on_delete=models.CASCADE)
approved = models.BooleanField(default=False)
def __str__(self):
return self.title
def get_absolute_url(self):
return reverse('post-detail', kwargs={'pk': self.pk})

views.py

from django.shortcuts import render, get_object_or_404
from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin
from django.contrib.auth.models import User
from django.views.generic import (
ListView,
DetailView,
CreateView,
UpdateView,
DeleteView
)
from .models import Post

def market(request):
context = {
'posts': Post.objects.all()
}
return render(request, 'userMarket/market.html', context)

class PostListView(ListView):
model = Post
template_name = 'userMarket/market.html'
context_object_name = 'posts'
ordering = ['-date_posted']
paginate_by = 5

class UserPostListView(ListView):
model = Post
template_name = 'userMarket/user_posts.html'
context_object_name = 'posts'
paginate_by = 5
def get_queryset(self):
user = get_object_or_404(User, username=self.kwargs.get('username'))
return Post.objects.filter(author=user).order_by('-date_posted')

class PostDetailView(DetailView):
model = Post

class PostCreateView(LoginRequiredMixin, CreateView):
model = Post
fields = ['title', 'content']
def form_valid(self, form):
form.instance.author = self.request.user
return super().form_valid(form)

class PostUpdateView(LoginRequiredMixin, UserPassesTestMixin, UpdateView):
model = Post
fields = ['title', 'content']
def form_valid(self, form):
form.instance.author = self.request.user
return super().form_valid(form)
def test_func(self):
post = self.get_object()
if self.request.user == post.author:
return True
return False

class PostDeleteView(LoginRequiredMixin, UserPassesTestMixin, DeleteView):
model = Post
success_url = '/market'
def test_func(self):
post = self.get_object()
if self.request.user == post.author:
return True
return False

市场.html

{% extends 'base.html' %}
{% block content %}
<div class="row">
<!-- Posts Layout -->
<div class="col-sm">
{% for post in posts %}
{% if post.approved == True %}
<div class="card my-4">
<div class="card-content">
<article class="media content-section my-2">
<img class="rounded-circle article-img my-2" src="{{ post.author.profile.image.url }}">
<div class="media-body">
<div class="article-metadata">
<a class="mr-2" href="{% url 'user-posts' post.author.username %}">{{ post.author }}</a>
<small class="text-muted">{{ post.date_posted|date:"F d, Y" }}</small>
</div>
<h3><a class="article-title ml-1" href="{% url 'post-detail' post.id %}">{{ post.title }}</a>
</h3>
<p class="article-content">{{ post.content }}</p>
</div>
</article>
</div>
</div>
{% endif %}
{% endfor %}
{% if posts == None and post.approved == False %}
<h3>No posts available</h3>
{% else %}
<!-- Pagination part-->
<div class="mt-4">
{% if is_paginated %}
{% if page_obj.has_previous %}
<a class="btn btn-outline-info mb-4" href="?page=1">First</a>
<a class="btn btn-outline-info mb-4" href="?page={{ page_obj.previous_page_number }}">Previous</a>
{% endif %}
{% for num in page_obj.paginator.page_range %}
{% if page_obj.number == num %}
<a class="btn btn-info mb-4" href="?page={{ num }}">{{ num }}</a>
{% elif num > page_obj.number|add:'-3' and num < page_obj.number|add:'3' %}
<a class="btn btn-outline-info mb-4" href="?page={{ num }}">{{ num }}</a>
{% endif %}
{% endfor %}
{% if page_obj.has_next %}
<a class="btn btn-outline-info mb-4" href="?page={{ page_obj.next_page_number }}">Next</a>
<a class="btn btn-outline-info mb-4" href="?page={{ page_obj.paginator.num_pages }}">Last</a>
{% endif %}
{% endif %}
</div>
{% endif %}
</div>
<div class="col-sm-2 my-4">
<div class="content-section">
<a class="btn btn-primary" href="{% url 'post-create' %}">Create Post</a>
</div>
</div>
</div>
{% endblock %}

最有效的方法是覆盖视图的get_queryset方法,仅将批准的帖子传递到模板:

class PostListView(ListView):
# ...
def get_queryset(self):
return Post.objects.filter(approved=True)

在您的模板中:

{% for post in page_obj %}
<!-- .... -->
{% empty %}
<h1>No posts!</h1>
{% endfor %}
{% if is_paginated %}
<!-- pagination code goes here -->
{% endif %}

而且您不再需要{% if post.approved %},因为只有批准的帖子才会传递到临时职位。

尝试{% if posts.all %}。它对我有用

最新更新