Как я могу убедиться, что пользователь голосует только один раз в Python Django? - PullRequest
0 голосов
/ 10 марта 2012

У меня есть модель Entry, которая имеет поле «Pushes», и я хочу, чтобы каждый пользователь «нажал» (проголосовал) один раз. Я искал и не мог найти то, что мне нужно.

Вот моя модель:

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 ]

4 голосов
/ 10 марта 2012

Если вы хотите разрешить только уникальных избирателей, вы не можете просто отслеживать голоса с номером - вам нужно сделать одну из двух вещей:

  • Записать голоса как независимые объекты, которые связаны спользователь
  • Записать историю голосования пользователя как часть объекта этого пользователя

Первое почти всегда проще сделать, особенно если ваши пользователи будут голосовать более чем в одном"выборы".

Как правило, вы должны создать объект голосования, который привязан как к тому, за кого голосуют, так и к пользователю, делающему голосование, а затем создать уникальный ключ для обоих этих элементов, чтобыдопускается существование только одного экземпляра любой пары.

0 голосов
/ 11 марта 2012

Вам необходимо настроить Составной первичный ключ (отправитель, нажимает) .. Поэтому, когда пользователь делает еще один голос, вы получите Ошибка

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
...