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