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
validiertdef 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
bodgedif 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?
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. –
Ihr Code scheint in Ordnung zu sein. Bleibt der Fehler bestehen? – zaidfazil
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. –