如何确保用户在python django中只投票一次?

时间:2012-03-10 19:45:26

标签: python django voting

我有一个具有“推送”字段的Entry模型,我希望每个用户“推”(投票)一次。 我搜索过,找不到我需要的东西。

这是我的模特:

class Entry(models.Model):
    title = models.CharField(max_length = 100)
    link = models.URLField(verify_exists=False)
    posted = models.DateTimeField(auto_now_add=True)
    submitter = models.ForeignKey(User, blank=True, null=True)
    pushes = models.PositiveIntegerField(default=0)

    def __unicode__(self):
        return self.title + " - " + unicode(self.submitter)

这是我的主页视图:

def homepage(request):
    entries = Entry.objects.all().order_by('-posted')
    paginator = Paginator(entries, 30)

    try: page = int(request.GET.get('page', '1'))
    except ValueError: page = 1

    try:
        entries = paginator.page(page)
    except (InvalidPage, EmptyPage):
        entries = paginator.page(paginator.num_pages)

    return render_to_response('index.html', {'entries' : entries},
                              context_instance=RequestContext(request))

如何才能使用户不能多次按下? 我是否必须创建新功能?
我应该改变模型中的某些东西吗?

2 个答案:

答案 0 :(得分:4)

如果你想只允许独特的选民,你不能只用数字跟踪投票 - 你需要做两件事之一:

  • 将投票记录为与用户相关的独立对象
  • 将用户的投票历史记录作为该用户对象的一部分

第一个几乎总是更容易做,特别是如果您的用户将在多个“选举”中投票。

通常,您要做的是创建一个投票对象,该投票对象与投票的事物和进行投票的用户相关联,然后在这两个项目上创建唯一键,以便只有任何给定配对的一个实例允许存在。

答案 1 :(得分:-2)

您需要设置复合主键(提交者,推送) ..因此,每当用户进行另一次投票时,您将获得错误

try:
  u = User.objects.get(username='abc')
  e = Entry(submitter=u,pushes=1)
  e.save()
  # User is able to vote
except Exception as e:
  # Cant vote Twice