我正在使用models.manager来计算投票数,但我不明白为什么投票数没有显示出来。投票系统正常运行(已与管理员核对),但经理不工作。
models.py
class PostVoteCountManager(models.Manager):
def get_query_set(self):
return super(PostVoteCountManager, self).get_query_set.annotate(
votes=Count('vote')).order_by("-votes")
class Post(models.Model):
rank_score = models.FloatField(default=0.0)
with_votes = PostVoteCountManager()
class Vote(models.Model):
voter = models.ForeignKey(User, on_delete=models.CASCADE)
post = models.ForeignKey(Post, on_delete=models.CASCADE)
def __str__(self):
return "%s voted %s" %(self.voter.username, self.post.title)
我的views.py
class PostListView(ListView):
model = Post
template_name = 'community/home.html' # <app>/<model>_<viewtype>.html
context_object_name = 'posts'
#ordering = ['-date_posted']
queryset = Post.with_votes.all()
def get_context_data(self, **kwargs):
context = super(PostListView, self).get_context_data(**kwargs)
if self.request.user.is_authenticated:
voted = Vote.objects.filter(voter=self.request.user)
posts_in_page = [post.id for post in context["object_list"]]
voted = voted.filter(post_id__in=posts_in_page)
voted = voted.values_list('post_id', flat=True)
context["voted"] = voted
return context
在html中,我做
{% for post in posts %}
<form method="post" action="{% url 'vote' %}" class="vote_form">
<li> [{{ post.votes }}]
{{post}}
{% csrf_token %}
<input type="hidden" id="id_post" name="post" class="hidden_id" value="{{ post.pk }}" />
<input type="hidden" id="id_voter" name="voter" class="hidden_id" value="{{ user.pk }}" />
{% if not user.is_authenticated %}
<button disabled title="Please login to vote">+</button>
{% elif post.pk not in voted %}
<button>+</button>
{% else %}
<button>-</button>
{% endif %}
</form>
{% endform%}
答案 0 :(得分:1)
您将函数编写为 ,但名称为get_query_set
get_queryset
[Django-doc]。此外,您忘记了在此处调用 get_queryset(..)
函数:
class PostVoteCountManager(models.Manager):
def get_queryset(self):
return super(PostVoteCountManager, self).get_queryset().annotate(
votes=Count('vote')).order_by("-votes")