在 Django 中增加一个 IntegerField

问题描述 投票:0回答:2

我正在尝试像 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) 

请问我该如何解决?

python django
2个回答
2
投票

更新投票计数后,您可能没有保存对“选项”对象所做的更改。确保在增加投票计数后调用“选项”对象上的“保存”方法:

这是它的示例代码:

option.votes += 1
user = UserProfile.objects.get(user = request.user)
option.voters.add(user) 
option.save()

0
投票

不要将票数与选民一起存储。保持两个字段同步比人们想象的要难得多。这意味着当您删除投票时,您需要确保投票数量减少,当用户删除他们的帐户时,您也必须减少投票数量。虽然这一切看起来非常简单,但很容易忘记某些用例。

通常你存储选民,例如参考相应的

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
的数量。


注意:通常使用

settings.AUTH_USER_MODEL
[Django-doc] 来引用用户模型,而不是使用
User
模型[Django- doc]
直接。有关更多信息,您可以查看文档的引用
User
模型
部分


注意HTTP协议的第9 指定像 GET 和 HEAD 这样的请求应该 not 有副作用,所以你 不应根据此类请求更改实体。通常是 POST、PUT、PATCH 和 DELETE 请求用于此。在那种情况下,你做一个小的

<form>
将触发 POST 请求,或者您使用一些 AJAX 调用。

© www.soinside.com 2019 - 2024. All rights reserved.