Django formset скрытый внешний ключ

Этот вопрос и ответ помогли мне пройти 90% пути . Так что спасибо сообществу.

У меня есть набор моделей, который проверяет и переходит в цикл «если он действителен».

модели.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)

формы.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']

просмотры.py

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

X и y используются для того, чтобы перевернуть набор запросов и дать мне последние 10 результатов в порядке убывания, чтобы вы добавили новый сеанс, обычно более поздний, в конец набора форм. это стилистический бред

Проблема в том, что когда я пытаюсь сохранить или отредактировать форму, я получаю:

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

Но я могу схитрить, добавив «if not none» в цикле сохранения:

заблокированные views.py

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

Я искренне не понимаю, почему именно это поле вызывает проблему. Понятно, что это полный бред

Я действительно веду себя глупо?


person T Duncan    schedule 01.07.2017    source источник


Ответы (1)


Вы не определили null=True для соответствующих полей. Если вы хотите, чтобы Django сохранял нулевые значения в базе данных, вы можете изменить строки,

session_start_datetime = models.DateTimeField(null=True, blank=True)
session_end_datetime = models.DateTimeField(null=True, blank=True)
person zaidfazil    schedule 01.07.2017
comment
Спасибо, но я не хочу, чтобы он сохранял нулевые значения. Эти значения являются обязательными. Каждая запись «сеанса» должна иметь начальную_дату/время и конечную_дату/время, так как это основа для всех последующих вычислений. - person T Duncan; 01.07.2017
comment
Ваш код выглядит нормально. Ошибка осталась?? - person zaidfazil; 01.07.2017
comment
Да, если я отлаживаю его и перебираю каждый из «сеансов» в представлении, я вижу, что происходит то, что каждая форма из набора форм передается функции сохранения, включая пустые. Я предполагаю, что причина, по которой эти поля вызывают проблемы, заключается в том, что они являются первыми, которые пытаются сохранить. Я хотел бы, чтобы сообщения об ошибках отображались для недействительных форм в наборе форм (правила еще не написаны), но я не хочу, чтобы сообщения об ошибках были для пустых форм. Я могу написать это вручную, но это кажется довольно неэлегантным. - person T Duncan; 02.07.2017