2017-07-01 7 views
0

This Frage und Antwort hat mich 90% des Weg dorthin. Also danke Gemeinde.Django Formset versteckte Fremdschlüssel

habe ich eine modelformset, die und geht in den 'wenn gültige' loop

models.py

class session_log(models.Model): 
    anaesthetist_id = models.ForeignKey('auth.User') 
    session_start_datetime = models.DateTimeField(blank=False) 
    session_end_datetime = models.DateTimeField(blank=False) 
    session_type= models.ForeignKey(session_types, null=True, blank=True) 
    session_comments=models.TextField(null=True, blank=True) 

    def __unicode__(self): 
     return str(self.anaesthetist_id)+" "+str(self.session_start_datetime.date())+" "+str(self.session_type) 

forms.py

class SessionList(forms.ModelForm): 

    session_comments = forms.CharField(required=False, widget=forms.Textarea(attrs={'rows':1})) 
    session_start_datetime = forms.DateTimeField(input_formats=['%d/%m/%y %H:%M',], widget=forms.DateTimeInput(format="%d/%m/%y %H:%M"))  
    session_end_datetime = forms.DateTimeField(input_formats=['%d/%m/%y %H:%M',], widget=forms.DateTimeInput(format="%d/%m/%y %H:%M"))  

    class Meta: 
     model = session_log 
     exclude = ('anaesthetist_id',) 
     fields = ['session_start_datetime', 'session_end_datetime', 'session_comments','session_type'] 

views.py

validiert
def session_overview(request): 


    SessionListFormSet = modelformset_factory(session_log, form=SessionList, extra = 10, exclude =('anaesthetist_id',), can_delete=True) 
    x = session_log.objects.filter(anaesthetist_id=request.user.id).count() 
    y = x-10 
    initialformset = SessionListFormSet(queryset=session_log.objects.filter(anaesthetist_id=request.user.id).order_by("session_start_datetime")[y:]) 
    if request.method == 'POST':  
     submitted_data = SessionListFormSet(data=request.POST) 
     if submitted_data.is_valid(): 
      for session in submitted_data: 
       new_session = session.save(commit=False) 
       new_session.anaesthetist_id = request.user 
       new_session.save() 

Die x und y ar e in dort, um den Queryset umzukehren und mir die letzten 10 Resultate in der absteigenden Reihenfolge zu geben, damit Sie eine neue Sitzung, normalerweise eine spätere, am Ende des Formsets hinzufügen. Es ist eine stilistische bodge

Das Problem ist, dass wenn ich versuche, und speichern oder eine Form bearbeiten ich:

IntegrityError at /trainee/dataentry/ 
NOT NULL constraint failed: trainee_session_log.session_end_datetime 

Aber ich kann es bodge durch Hinzufügen eines ‚wenn nicht none‘ im speichern Schleife:

views.py

bodged
if request.method == 'POST':  
    submitted_data = SessionListFormSet(data=request.POST) 
    if submitted_data.is_valid(): 
     for session in submitted_data: 
       new_session = session.save(commit=False) 
       new_session.anaesthetist_id = request.user 
       if new_session.session_end_datetime is not None: 
        new_session.save() 

ich ratlos bin wirklich, warum es das Feld ist nur, dass das Problem verursacht. Klar, das ist ein totaler Wagen

Bin ich wirklich albern?

Antwort

0

Sie haben null=True für die entsprechenden Felder nicht definiert. Wenn Sie möchten, dass Django Nullwerte in der Datenbank speichert, dann können Sie die Zeilen ändern,

session_start_datetime = models.DateTimeField(null=True, blank=True) 
session_end_datetime = models.DateTimeField(null=True, blank=True) 
+0

Vielen Dank, aber ich don 't wollen es null Werte zu speichern. Diese Werte sind erforderlich. Jeder 'Session'-Datensatz muss ein Startdatum/-zeit und ein Enddatum/-zeit haben, da dies die Basis für alle nachfolgenden Berechnungen ist. –

+0

Ihr Code scheint in Ordnung zu sein. Bleibt der Fehler bestehen? – zaidfazil

+0

Ja, wenn ich es debuggen und durch jede der "Sitzungen" in der Ansicht durchlaufen, kann ich sehen, dass was passiert ist, dass jedes Formular aus dem Formularsatz an die Speicherfunktion übergeben wird, einschließlich der leeren. Ich nehme an, der Grund, dass diese Felder die Probleme verursachen, ist, dass sie die ersten sind, die versucht werden, gespeichert zu werden. Ich möchte, dass Fehlermeldungen für nicht gültige Formulare innerhalb des Formsets angezeigt werden (Regeln, die noch geschrieben werden sollen), aber ich möchte keine Fehlermeldungen für leere Formulare. Ich kann das manuell schreiben, aber es scheint ziemlich unelegant. –