Django - 如何在form.save(commit = False)之后最好地处理ValidationErrors

时间:2010-03-31 02:01:55

标签: django django-models django-forms django-validation

这是我的代码的一个片段:

    if form.is_valid():
        instance = form.save(commit=False)
        try:
            instance.account = request.account
            instance.full_clean()
        except ValidationError, e:
            # Do something with the errors here... I certainly don't want to do this 180 times.

这是一个彻头彻尾的混乱。谁想要在每个视图中手动处理验证错误。如果您没有在save(commit=False)之后修改实例,则不必担心这一点,但在我的情况下,每个模型都有account的外键,这是在幕后设置的和隐藏的用户?

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

由于问题上的标记,我认为formModelForm

ModelForm performs model validation when you call is_valid()起,它应该足以确保它将验证的模型实例已经包含您在调用is_valid()之前要进行的任何幕后更改。

您可以在致电form.instance之前修改is_valid()并修改class PresetAttrsModelForm(ModelForm): def __init__(self, *args, **kwargs): preset_attrs = kwargs.pop('preset_attrs', None) # Sets up self.instance, among other things super(ModelForm, self).__init__(*args, **kwargs) if preset_attrs: for attr, value in preset_attrs.items(): setattr(self.instance, attr, value) class MyModelForm(PresetAttrsModelForm): class Meta: model = MyModel form = MyModelForm(preset_attrs={'account': request.account})

在表单中进行这些更改的更通用的解决方案是:

{{1}}

答案 1 :(得分:1)

不确定是否正确理解您的问题,但如果您希望在表单中“集中”数据验证,则可以覆盖表单的clean()方法:

django docs - overwrite clean method

为了根据表单中传递的数据更改对象的数据,您可以覆盖form.save方法:

SOF discussion - overwrite save method