2017-08-29 6 views
0

Ich versuche ein Abstimmungssystem mit Django einzurichten, das einen registrierten Benutzer nur einmal bei einer einzigen Abstimmung abstimmen lässt (obwohl es mehrere verfügbare Optionen gibt, stimme zu/stimme voll zu/nicht zu). Bisher war ich in der Lage, ein System einzurichten, in dem sie nicht genau abstimmen können (so dass sie nicht zweimal "zustimmen" können), aber sie können ihre Stimme ändern und es geht weiter (so sie kann "zustimmen" und dann erneut als "nicht einverstanden" stimmen. Ich möchte, dass sie auf eine Stimme pro Thema beschränkt sind, und ich kann nicht genau herausfinden, wie ich meinen Code optimieren kann, um dies zu erreichen. Hier ist meine Ansicht:Duplizieren verhindern, wenn es mehr als eine mögliche Auswahl gibt?

def vote(request, prediction_id): 
    prediction = get_object_or_404(Prediction, pk=prediction_id) 
    selected_choice = prediction.choice_set.get(pk=request.POST['choice']) 

    if Voter.objects.filter(prediction=prediction, choice=selected_choice, user_id=request.user.id).exists(): 

     return render(request, 'predictions/detail.html', { 
      'prediction': prediction, 
      'error_message': "Sorry, but you have already voted." 
     }) 

    else: 

     selected_choice.votes += 1 
     selected_choice.save() 
     Voter.objects.create(prediction=prediction, choice=selected_choice, user_id=request.user.id) 

    return HttpResponseRedirect(reverse('predictions:results', args=(prediction.id,))) 

und hier sind meine Modelle:

class Prediction(models.Model): 
    prediction_text = models.CharField(max_length=200) 
    pub_date = models.DateTimeField('date published') 
    # ... 
    def __str__(self): 
     return self.prediction_text 

class Choice(models.Model): 
    prediction = models.ForeignKey(Prediction, on_delete=models.CASCADE) 
    choice_text = models.CharField(max_length=200) 
    votes = models.IntegerField(default=0) 
    def __str__(self): 
     return self.choice_text 

class Voter(models.Model): 
    user = models.ForeignKey(User) 
    choice = models.ForeignKey(Choice) 
    prediction = models.ForeignKey(Prediction) 
+0

Vielleicht möchten Sie Ihre Modelle zur Neugestaltung eines 'Topic' Modell haben, ein‚Choice‘Modell und ein‚VoterChoice‘-Modell, wobei‚VoterChoice‘Attribute' topic' hat, 'Benutzer ',' choice' und eine eindeutige Einschränkung für ('topic',' user'). – azalea

+0

Wie genau würde ich die eindeutige Einschränkung dort setzen? Ich glaube, dass die Themen/Benutzer/Auswahl-Modelle, die Sie erwähnt haben, meinen Vorhersagen/Wahl/Wähler-Modellen entsprechen, sie haben nur unterschiedliche Namen. Der einzige Teil, mit dem ich wirklich zu kämpfen habe, ist, glaube ich, den Wähler zu begrenzen, indem er diese einzigartige Einschränkung setzt. – yoursweater

Antwort

0
if Voter.objects.filter(prediction=prediction, user_id=request.user.id).exists() 

Diese Zeile Code sagen, wenn der User in jeder Wahl gestimmt.

Wenn ich unterstreichen kann, ist die Klasse Prediction die "Frage". So werden andere Lösung ist:

class Voter(models.Model): 
    user = models.ForeignKey(User) 
    choice = models.ForeignKey(Choice) 
    prediction = models.ForeignKey(Prediction) 

Meta: 
    unique_together = (("driver", "prediction"),) 
Verwandte Themen