Django:使用“Unique Together”保存并通过inlineformset删除对象会导致错误页面

时间:2012-03-23 18:02:30

标签: django forms django-models inline-formset

很抱歉,如果这是一个简单的修复,我的inlineformset有2个问题:

  1. 保存无效对象(不符合唯一要求)会抛出错误页面而不是在表单中显示错误。

    有一次,我在保存无效对象时错误地显示错误,但是当我尝试保存有效对象时,我会收到一条错误消息,指出membership.department为空。这就是为什么我把“例如在实例中”,但现在我得到了这个新问题,即在保存无效对象时不显示错误。

  2. 删除有效对象时遇到同样的问题。对象会被删除,但我仍然会收到错误页面...

  3. 我迷路了。

    保存无效对象时,我得到:

    The Membership could not be created because the data didn't validate.
    

    删除有效对象时,我得到:

    [u'Select a valid choice. That choice is not one of the available choices.']
    

    MODEL:

    class Membership(models.Model):
        project = models.ForeignKey(Project)
        department = models.ForeignKey(Department)
        employee = models.ForeignKey(Employee)
        role = models.ManyToManyField(Role, blank=True, null=True)
        class Meta:
            unique_together = (("project", "employee",),)
    

    VIEW.py

    def employee_edit(request, employee_id):
        i = get_object_or_404(Employee, pk=employee_id)
        MembershipForm = make_membership_form(i)
        MembershipFormSet = inlineformset_factory(Employee, Membership, exclude='department', extra=1, form=MembershipForm)
        if request.method == "POST":
            f = MembershipFormSet(request.POST, instance=i)
            if f.is_valid():
                instances = f.save(commit=False)
                for instance in instances:
                    instance.department = i.department
                    instance.save()
                f.save_m2m()
                return render_to_response('dbtest/edit.html', {'item': i, 'formset': f, }, context_instance=RequestContext(request))
        else:
            f = MembershipFormSet(instance=i)
        return render_to_response('dbtet/edit.html', {'item': i, 'formset': f, }, context_instance=RequestContext(request))
    
    def make_membership_form(i):
        class MembershipForm(forms.ModelForm):
            project = forms.ModelChoiceField(queryset=Project.objects.filter(department=i.department))
            class Meta:
                model = Membership
                exclude = ('department', 'employee')
                unique_together = (("project", "employee",),)
        return MembershipForm
    

1 个答案:

答案 0 :(得分:1)

第一条错误信息很简单。

The Membership could not be created because the data didn't validate.

您正在保存formset,而不先检查它是否有效。如果formset.is_valid()为真,您应该只调用save。再看看my answer to your previous question