2016-11-08 5 views
0

Ich bin neu in Django und ich habe gekämpft, um den ausgewählten Wert der forms.ModelChoiceField in meinen Ansichten zu bekommen. Mein Formular (Post) ist nicht gültig und ich habe festgestellt, dass request.POST alle möglichen Werte im ModelChoiceField zurückgibt. Wie bekomme ich nur das vom Benutzer ausgewählte Modell? Vielen Dank im Voraus für jede Hilfe.Django ungültiges Formular bei der Verwendung von Modelchoicefield

Modell

I ein Sensormodell sowie ein Messmodell ...

class Sensor(models.Model): 
    # This contains information about a sensor, type, location, and other 
    type = models.CharField(max_length=16) 
    ... 

class Measurement(models.Model): 
    #This contains the measurements of the sensors at a given date 
    sensor = models.ForeignKey('Sensor') 
    date = models.DateField() 
    temperature = models.FloatField() 
    pressure = models.FloatField() 
    ... 
    class Meta: 
     unique_together = ('sensor', 'date') 

Formular

... und eine Form haben, die dem Benutzer ermöglicht, Wählen Sie den Sensor und das Datum:

class MeasurementForm(forms.ModelForm): 
    #the user is allowed to choose any sensor that is related to the measurement table 
    sensor = forms.ModelChoiceField(queryset=Sensor.objects.exclude(measurement=None)) 
    date = forms.DateField(widget=DateInput(attrs={'format':'%Y-%m-%d'}), initial=datetime.today) 

Soweit so gut, wird dies durch die Get-Methode gerendert und der Benutzer kann Sensor und Datum auswählen. Allerdings schlägt die folgende Ansicht bei der Post, nach der Einreichung:

Ansichten

class MeasurementView(View): 
    form_class = MeasurementForm 
    my_template = "measurement.html" 

    def get(self, request, *args, **kwargs): 
     form = self.form_class() 
     return render(request, self.my_template, {'form': form, 'data':None}) 

    def post(self, request, *args, **kwargs): 
     print(request.POST) 
     print(new_form.errors) 
     new_form = self.form_class(data=request.POST) 
     if new_form.is_valid(): 
      print('form is valid') 
      data = get_data_for_sensor_date(
         new_form.cleaned_data['sensor'], 
         new_form.cleaned_data['date'])) 
      return render(request, self.my_template, {'form':new_form, 'data':data}) 
     else: 
      return render(request, self.my_template, {'form':new_form, 'data':None}) 

Konsolenausgabe

<QueryDict: {'sensor': ['', '1'], 
      'csrfmiddlewaretoken': ['YUPfrdhdbQdAa7EyNx2sJeHdbxmQXTTW'], 
      'date': ['2016-11-07']}> 

<ul class="errorlist"> 
    <li>__all__ 
    <ul class="errorlist nonfield"> 
     <li>Measurement with this Sensor and Date already exists. 
     </li> 
    </ul> 
    </li> 
</ul> 
+0

Danke. Bearbeiten Sie den Code ab sofort – b3rtz

+2

wie werden Sie das Formular in der Vorlage angezeigt wird? Drucken 'request.POST' und' new_form.errors' im 'Post' Verfahren könnte helfen zu erklären, was vor sich geht. – Alasdair

+0

Frage aktualisiert, um th hinzuzufügen Das Ergebnis des Druckens. Ich bekomme die Fehlermeldung nicht. Ich weiß, dass sie existieren und genau das brauche ich. – b3rtz

Antwort

0

ich diesen Link gefunden Django formview returns object already exists error with a modelform

, auf die ich Zitat: "Ok. Ich habe eine Lösung für meine Er gefunden ror. Was verursacht das Modell bereits existiert Fehler war mein ModelForm CheckProductForm. Das Codename-Attribut ist eindeutig, daher hat meine Validierung immer False zurückgegeben. Was ich getan habe, war meine ursprüngliche ModelForm in ein Formular zu ändern. Das hat mein ganzes Problem gelöst. Und für die form_invalid in form_valid Problem. Ich habe die Funktion clean_codename meines Formulars überschrieben, um ValidationError zu erhöhen, wenn das Produkt nicht existiert. "

Ich verstehe immer noch nicht, warum ich den Fehler überhaupt hatte. Das Ändern des Formulars in den Code unten machte jedoch den Trick.

Formular

class MeasurementForm(forms.Form): 
    #the user is allowed to choose any sensor that is related to the measurement table 
    sensor = forms.ModelChoiceField(queryset=Sensor.objects.exclude(measurement=None)) 
    date = forms.DateField(widget=DateInput(attrs={'format':'%Y-%m-%d'}), initial=datetime.today) 
+1

Sie haben 'unique_together = ('Sensor', 'Datum')' für Ihr Modell. Das bedeutet, dass Sie für jeden Sensor nur eine Messung pro Tag durchführen können. Wenn Sie ein Modellformular verwenden, ohne "Instanz" zu setzen, validiert Django die eindeutige Einschränkung, um zu verhindern, dass Sie eine doppelte Messung erstellen. Da Sie bereits eine Messung für dieses Datum und diesen Sensor in der Datenbank haben, ist das Formular ungültig und Sie erhalten den Fehler. Da Sie auf ein reguläres Formular umgestellt haben, wird die Einschränkung 'unique_together' nicht mehr überprüft, daher ist das Formular gültig. – Alasdair

+0

Danke Alasdair. Eine Messung pro Tag ist das richtige Verhalten für mein Modell. Mir war nicht bewusst, dass Django automatisch die Überprüfung am Formular aus dem Modell durchführt, aber es macht Sinn. Vielen Dank. – b3rtz

Verwandte Themen