1

这是我的代码片段:

    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在幕后设置并隐藏用户怎么办?

非常感谢任何帮助。

4

2 回答 2

2

我认为formModelForm由于问题上的标签。

由于ModelForm在您调用时执行模型验证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})
于 2010-03-31T10:51:12.807 回答
1

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

django docs - 覆盖干净的方法

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

SOF讨论——覆盖保存方法

于 2010-03-31T09:44:48.153 回答