Django内联表单集验证通过,但未保存任何对象

Django内联表单集验证通过,但未保存任何对象,django,django-forms,inline-formset,Django,Django Forms,Inline Formset,我有以下表格: class ServiceTargetForm(forms.ModelForm): class Meta: model = ServiceTarget fields=('target_type', 'target_value', 'target_threshold') 所有字段都是必填字段 为了使一切更加复杂,该模型具有独特的条件: class ServiceTarget(models.Model): service = mode

我有以下表格:

class ServiceTargetForm(forms.ModelForm):
    class Meta:
        model = ServiceTarget
        fields=('target_type', 'target_value', 'target_threshold')
所有字段都是必填字段

为了使一切更加复杂,该模型具有独特的条件:

class ServiceTarget(models.Model):
    service = models.ForeignKey(Service, verbose_name = _(u"Service"))
    all the other fields
    ...
    class Meta:
        ordering = ['service__car__name', 'service__car__reg_no','service__name',]
        verbose_name = _(u"Service target")
        verbose_name_plural = _(u"Service targets")
        unique_together = ("service__id", "target_type")
这样保存空表单:

ServiceTargetFormSet = inlineformset_factory(Service, ServiceTarget, extra = 1, form = ServiceTargetForm, formset = MyInlineFormSet)
if request.method == 'POST':
    form = ServiceForm(request.POST, cars_queryset = cars_queryset, client = account)

    if form.is_valid():
        new_service = form.save(commit = False)
        stformset = ServiceTargetFormSet(request.POST, instance = new_service)
        if stformset.is_valid():
            form.save()
            stformset.save()
            messages.success(request, ugettext(u"New service was successfully created."))
            redirect_to = '/services/'
            return HttpResponseRedirect(request, redirect_to)
        else:
            messages.error(request, ugettext(u"Creating new service failed"))
如果防御失败——但事实并非如此。发布的查询集是:

<QueryDict: {u'servicetarget_set-0-target_value': [u''], u'servicetarget_set-INITIAL_FORMS': [u'0'], u'name': [u'asdasd2q31'], u'recipients': [u'4'], u'car': [u'22'], u'message_delivery_method': [u'email'], u'servicetarget_set-0-target_threshold': [u''], u'servicetarget_set-TOTAL_FORMS': [u'2'], u'more-rows-count': [u'0'], u'servicetarget_set-0-target_type': [u'km'], u'servicetarget_set-1-target_type': [u'km'], u'csrfmiddlewaretoken': [u'blablabla'], u'servicetarget_set-1-target_value': [u''], u'servicetarget_set-MAX_NUM_FORMS': [u''], u'message': [u'asdasdasd'], u'servicetarget_set-1-target_threshold': [u'']}>
更新2:
此处接受的Answare说明了为什么不会出现错误-显然,表单必须将empty_permited设置为False。

这不完全是此项的重复:

但这里的答案也适用

如果formsets表单类没有将Empty_Allowed参数设置为False,则空表单通过验证

因此,您可以通过以下两种方式之一解决此问题:

  • 他们在我添加的链接中这样做的方式
  • 在formsets表单类
    中执行相同的操作

  • 它不完全是这个的复制品:

    但这里的答案也适用

    如果formsets表单类没有将Empty_Allowed参数设置为False,则空表单通过验证

    因此,您可以通过以下两种方式之一解决此问题:

  • 他们在我添加的链接中这样做的方式
  • 在formsets表单类
    中执行相同的操作

  • @Odif Yltsaeb虽然我参加聚会迟到了,但我想知道如何处理我在这里面临的一个稍有不同的问题()@Odif Yltsaeb虽然我参加聚会迟到了,但我想知道如何处理我在这里面临的一个稍有不同的问题()
    q = 'servicetarget_set-0-target_value=&servicetarget_set-INITIAL_FORMS=0&servicetarget_set-0-id=&name=asdasdasd&recipients=4&car=13&servicetarget_set-1-target_type=km&servicetarget_set-1-service=&servicetarget_set-0-target_threshold=&servicetarget_set-TOTAL_FORMS=2&servicetarget_set-0-service=&servicetarget_set-1-target_threshold=&more-rows-count=0&servicetarget_set-0-target_type=km&servicetarget_set-1-id=&csrfmiddlewaretoken=90018471df61d327b6288cb38ad15630&servicetarget_set-1-target_value=&servicetarget_set-MAX_NUM_FORMS=&message=asdasdasd&message_delivery_method=email'
    
    from django.http import QueryDict
    qd = QueryDict(q)
    from account.models import Account
    account = Account.objects.get(id = 2)
    from services.models import Service, ServiceTarget
    from services.forms import ServiceTargetForm, MyInlineFormSet, ServiceForm
    from django.contrib.auth.models import User
    u = User.objects.get(id = 5)
    from guardian.shortcuts import get_objects_for_user
    cars_queryset = get_objects_for_user(u, 'cars.can_access_car').order_by('reg_no').filter(client = account)
    form = ServiceForm(qd, cars_queryset = cars_queryset, client = account)
    form.is_valid()
    True
    new_service = form.save(commit = False)
    from django.forms.models import inlineformset_factory
    ServiceTargetFormSet = inlineformset_factory(Service, ServiceTarget, fk_name="service", extra = 1, form = ServiceTargetForm, formset = MyInlineFormSet)
    stformset = ServiceTargetFormSet(qd, instance = new_service)
    stformset.is_valid()
    True
    stformset.cleaned_data
    [{}, {}]
    stformset.errors
    [{}, {}]
    stformset.non_form_errors()
    []