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

如何确保用户在python django中只投票一次?,python,django,voting,Python,Django,Voting,我有一个条目模型,它有一个“push”字段,我希望每个用户“push”(投票)一次。 我找了又找不到我需要的东西 这是我的模型: class Entry(models.Model): title = models.CharField(max_length = 100) link = models.URLField(verify_exists=False) posted = models.DateTimeField(auto_now_add=True) submit

我有一个条目模型,它有一个“push”字段,我希望每个用户“push”(投票)一次。 我找了又找不到我需要的东西

这是我的模型:

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))
如何使用户不能多次推送?
我必须创建一个新函数吗?

我是否应该更改模型中的某些内容?

如果您只想允许唯一的投票人,您不能只使用数字跟踪投票-您需要做以下两件事之一:

  • 将投票记录为绑定到用户的独立对象
  • 将用户的投票历史记录作为该用户对象的一部分
第一种方法几乎总是比较简单,尤其是当你的用户要在不止一次的“选举”中投票时


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

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

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

复合主键与
unique\u一起
不同,这会创建
unique
约束。复合主键的工作正在进行中。我的意思是,
unique\u在一起
实际上。。!!。。谢谢你纠正它。。!!因此,我应该使用用户外键和条目创建一个投票模型