我正在尝试像 Django 文档中那样实现投票应用程序。 我有一个 IntegerField 来表示一个选项在我的民意调查应用程序中的票数,但是如果我尝试将选民添加到选民列表中并在我的
views.py
中每次用户投票时将其增加一个,它会添加到用户加入选民名单,但票数没有增加。
这是我的选择模型......
votes = models.IntegerField(default=0)
voters = models.ManyToManyField(UserProfile, blank=True, related_name="my_votes")
这是我在
views.py
中的投票功能
option.votes += 1
user = UserProfile.objects.get(user = request.user)
option.voters.add(user)
请问我该如何解决?
更新投票计数后,您可能没有保存对“选项”对象所做的更改。确保在增加投票计数后调用“选项”对象上的“保存”方法:
这是它的示例代码:
option.votes += 1
user = UserProfile.objects.get(user = request.user)
option.voters.add(user)
option.save()
请不要将票数与选民一起存储。保持两个字段同步比人们想象的要难得多。这意味着当您删除投票时,您需要确保投票数量减少,当用户删除他们的帐户时,您也必须减少投票数量。虽然这一切看起来非常简单,但很容易忘记某些用例。
通常你存储选民,例如参考相应的
User
模型:
from django.conf import settings
class Choice(models.Model):
# …
voters = models.ManyToManyField(
settings.AUTH_USER_MODEL, blank=True, related_name='my_votes'
)
然后在视图中将登录用户添加到选择中:
from django.contrib.auth.decorators import login_required
from django.shortcuts import redirect
from django.views.decorators.http import require_POST
@login_required
def vote_for_choice(request, choice_pk):
choice = get_object_or_404(Choice, pk=choice_pk)
choice.voters.add(request.user)
return redirect('name-of-some-view')
.annotate(…)
[Django-doc]:
from django.db.models import Count
Choice.objects.annotate(votes=Count('voters'))
从这个查询集中产生的
Choice
对象将有一个额外的属性.votes
包含相关voters
的数量。
[Django-doc] 来引用用户模型,而不是使用settings.AUTH_USER_MODEL
模型[Django- doc] 直接。有关更多信息,您可以查看文档的引用User
模型部分。User
注意:HTTP协议的第9 指定像 GET 和 HEAD 这样的请求应该 not 有副作用,所以你 不应根据此类请求更改实体。通常是 POST、PUT、PATCH 和 DELETE 请求用于此。在那种情况下,你做一个小的
将触发 POST 请求,或者您使用一些 AJAX 调用。<form>