这是我的代码的一个片段:
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
的外键,这是在幕后设置的和隐藏的用户?
非常感谢任何帮助。
答案 0 :(得分:2)
由于问题上的标记,我认为form
是ModelForm
。
自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方法: