Django 是否在未提供强制字段时保存表单集?

Django 是否在未提供强制字段时保存表单集?,django,django-forms,Django,Django Forms,当我试图在更新视图中保存一个表单集并且该表单集添加了新表单时,我收到一个错误“NOT NULL constraint failed”。我认为原因是数据库有一个必填字段(journal\u entry),它不是表单集ModelForm的一部分。因此,当试图保存表单集lineitem_formset.save()时,我得到了错误 如何在保存表单集之前添加此必填字段值 View.py @login_required def entries_update(request, pk): journa

当我试图在更新视图中保存一个表单集并且该表单集添加了新表单时,我收到一个错误“NOT NULL constraint failed”。我认为原因是数据库有一个必填字段(journal\u entry),它不是表单集ModelForm的一部分。因此,当试图保存表单集lineitem_formset.save()时,我得到了错误

如何在保存表单集之前添加此必填字段值

View.py

@login_required
def entries_update(request, pk):
    journal_entry = get_object_or_404(JournalEntry, pk=pk)
    journal_entry.date = journal_entry.date.strftime('%Y-%m-%d') #Convert date format to be suitable for Datepicker input.
    journal_entry_form = JournalEntryForm(instance=journal_entry)

    LineItemFormSet = modelformset_factory(LineItem, fields=('ledger','description','project','cr','dr'), extra=2)
    line_items = LineItem.objects.filter(journal_entry=journal_entry)
    lineitem_formset = LineItemFormSet(queryset=line_items)

    if request.method == 'POST':
        lineitem_formset = LineItemFormSet(request.POST)
        journal_entry_form = JournalEntryForm(request.POST, instance=journal_entry)
        if lineitem_formset.is_valid() and journal_entry_form.is_valid:
            lineitem_formset.save()       <-- ERROR HAPPENS HERE
            journal_entry_form.save()
            messages.success(request, "Journal entry successfully updated.")
            return HttpResponseRedirect(reverse('journal:entries_show_detail', kwargs={'pk': journal_entry.id}) )
@需要登录\u
def条目_更新(请求,主键):
日志记录=获取对象或404(日志记录,pk=pk)
journal_entry.date=journal_entry.date.strftime(“%Y-%m-%d”)#将日期格式转换为适合日期选择器输入的格式。
日记账\条目\表单=日记账表单(实例=日记账\条目)
LineItemFormSet=modelformset_工厂(LineItem,字段=('ledger','description','project','cr','dr'),额外=2)
行项目=行项目.对象.过滤器(日记账项目=日记账项目)
lineitem_formset=LineItemFormSet(queryset=line_items)
如果request.method==“POST”:
lineitem_formset=LineItemFormSet(request.POST)
日记账\条目\表单=日记账表单(request.POST,实例=日记账\条目)
如果lineitem_formset.is_valid()和日记账_entry_form.is_valid:

lineitem_formset.save()再次感谢@Iain Shelvington。编辑以下行以使用内联表单集,现在可以使用:

LineItemFormSet = inlineformset_factory(JournalEntry, LineItem, fields=('ledger','description','project','cr','dr'), extra=2)
以及:


您应该使用内联模型表单集
class JournalEntryForm(ModelForm):
    def clean_date(self):
        data = self.cleaned_data['date']
        #Check date is not more than 30d future
        if data > (datetime.date.today() + datetime.timedelta(30)):
            raise ValidationError('Date cannot be more than 30d future')
        if data < (datetime.date.today() - datetime.timedelta(90)):
            raise ValidationError('Date cannot be more than 90d past')
        return data
    class Meta:
        model = JournalEntry
        fields = ['date','description']
        widgets = {'date': DateTypeInput()}

class LineItemForm(ModelForm):
    class Meta:
        model = LineItem
        fields = ['ledger','description','project','cr','dr']
    # This init disallows empty formsets
    def __init__(self, *arg, **kwarg):
            super(LineItemForm, self).__init__(*arg, **kwarg)
            self.empty_permitted = False
    def clean(self):
        cr = self.cleaned_data['cr']
        dr = self.cleaned_data['dr']
        if cr == None and dr == None:
            raise ValidationError('You must enter a CR or DR.')
        if cr and dr:
            raise ValidationError('You must enter a CR or DR, not both.')
LineItemFormSet = inlineformset_factory(JournalEntry, LineItem, fields=('ledger','description','project','cr','dr'), extra=2)
lineitem_formset = LineItemFormSet(request.POST, instance=journal_entry)