【问题标题】:Django: Saving with "Unique Together" and Deleting objects via inlineformset causes error pagesDjango:使用“Unique Together”保存并通过 inlineformset 删除对象会导致错误页面
【发布时间】:2012-04-08 07:31:32
【问题描述】:

对不起,如果这是一个简单的修复,我的内联表单集有 2 个问题:

  1. 保存无效对象(不满足唯一性要求)会引发错误页面,而不是在表单中显示错误。

    在保存无效对象时,有时我的错误会正确显示,但当我尝试保存有效对象时,我会收到一条错误消息,提示 members.department 为空。这就是为什么我把“例如在实例中”,但现在我遇到了保存无效对象时不显示错误的新问题。

  2. 我在删除有效对象时遇到了同样的问题。该对象被删除,但我仍然得到一个错误页面......

我迷路了。

当我保存无效对象时:

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.']

型号:

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

【问题讨论】:

    标签: django forms django-models inline-formset


    【解决方案1】:

    第一个错误消息非常简单。

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

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

    【讨论】:

    • 所以我重新编辑了我的问题以反映您之前的答案,但是当会员资格未通过验证而不是论坛中出现错误时,我仍然收到错误页面...
    • 我并不是建议您从内联模型表单集更改为常规模型表单集 - 只是您整理出检查表单集是否有效并保存的位。你现在得到什么错误?请注意,unique_together = (("project", "employee",),) 不会在模型表单中执行任何操作 - 它只是模型的一个选项。
    • 将其改回内联模型表单集,当对象无效时会显示错误。它也保存了一个有效的对象。但是删除有效对象对我来说仍然是一个问题。我已经更新了我的代码。
    • 循环访问您的实例后不要再次调用f.save()。如果有任何多对多关系需要更新,您确实需要f.save_m2m()。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-25
    • 1970-01-01
    • 2017-11-05
    • 2010-10-22
    • 1970-01-01
    • 2014-05-30
    • 1970-01-01
    相关资源
    最近更新 更多