2016-04-26 1 views
0

Ich verstehe nicht, warum ich diesen Fehler erhalten habe:"Wählen Sie eine gültige Auswahl." Fehler bei der Verwendung von Modelform in Django

"Wählen Sie eine gültige Wahl. Diese Wahl ist nicht eine der verfügbaren Möglichkeiten." Die Fehlermeldung ist in dem Feld "Konto"

Hier sind meine Modell:

class Account(models.Model): 
    owner = models.ForeignKey(User, on_delete=models.CASCADE) 
    balance = models.FloatField() 
    name = models.CharField(max_length=50) 

    def __str__(self): 
     return self.name 


class Entry(models.Model): 
    account = models.ForeignKey("Account", on_delete=models.CASCADE) 
    amount = models.FloatField() 
    expense = models.BooleanField(default=True) 
    date = models.DateTimeField() 
    usage = models.CharField(max_length=200, blank=True) 
    payment_method = models.ForeignKey("PaymentMethod", on_delete=models.CASCADE) 
    category = models.ForeignKey("Category", on_delete=models.CASCADE) 

    def __str__(self): 
     return "{} - {}".format(self.date, self.account) 

Meine Ansicht:

class AddExpenseView(View): 
    template_name = "finance/create_booking.html" 
    form_class = CreateBookingForm 

    @method_decorator(login_required) 
    def get(self, request): 
     context = { 
      "title": "StatYourLife - Neue Ausgabe", 
      "create_booking_form": self.form_class(user=request.user) 
     } 

     return render(request, self.template_name, context) 
    @method_decorator(login_required) 
    def post(self, request): 
     form = self.form_class(request.POST) 
     if form.is_valid(): 
      user_profile = UserProfile.objects.get(user_id=request.user) 
      booking = form.save(commit=False) 
      account = booking.account 
      account.balance -= booking.amount 
      booking.expense = True 
      booking.date = timezone.now() 
      user_profile.entrys += 1 
      user_profile.save() 
      account.save() 
      booking.save() 
      return HttpResponseRedirect(reverse("finance:index")) 
     else: 
      context = { 
       "title": "test", 
       "create_booking_form": form 
      } 
      return render(request, self.template_name, context) 

und meine Form:

class CreateBookingForm(forms.ModelForm): 

    def __init__(self, *args, **kwargs): 
     self.user = kwargs.pop('user', None) 
     super(CreateBookingForm, self).__init__(*args, **kwargs) 
     self.fields["account"].queryset =  Account.objects.filter(owner=self.user) 

    class Meta: 
     model = Entry 
     exclude = ["expense", "date"] 

I Werke Gut, bis ich versuche, dieses Formular mit einem ausgewählten Kontotyp zu senden.

+0

Wo ist die 'post' Methode auf AddExpenseView? –

+0

Entschuldigung, ich habe die Post-Methode hinzugefügt – knusperwurst

Antwort

3

In Ihrer Post-Methode haben Sie vergessen, die user an das Formular zu übergeben. Da Sie das Queryset des Feldes account auf festgelegt haben, bedeutet dies, dass Sie beim Anzeigen des Formulars beim Validieren der Daten einen anderen Queryset haben.

Ändern Sie es an:

self.user = kwargs.pop('user') 

Dann würden Sie einen expliziten Fehler, wenn user von kwargs fehlt:

def post(self, request): 
    form = self.form_class(request.POST, user=self.request.user) 

Es könnte besser sein, das Formular zu ändern.

+0

das hat den Trick gemacht, ich fühle mich jetzt wirklich dumm ._. Vielen Dank! – knusperwurst