在管理网站中,我有一个自定义表单。但是,我想覆盖save方法,以便在输入某个关键字时,我不会将其保存到数据库中。这可能吗?
class MyCustomForm (forms.ModelForm):
def save(self, commit=True):
input_name = self.cleaned_data.get('input_name', None)
if input_name == "MyKeyword":
//Do not save
else:
return super(MyCustomForm, self).save(commit=commit)
但这会返回错误:
AttributeError 'NoneType' object has no attribute 'save'
修改 在此之后:Overriding the save method in Django ModelForm
我试过了:
def save(self, force_insert=False, force_update=False, commit=True):
m = super(MyCustomCategoryForm, self).save(commit=False)
input_name = self.cleaned_data.get('input_name', None)
if input_name != "MyKeyword":
m.save()
return m
但是如果input_name是“MyKeyword”
,管理站点仍然会创建一个新条目答案 0 :(得分:1)
save()
方法应该返回对象,无论是否保存。它应该看起来像:
def save(self, commit=True):
input_name = self.cleaned_data.get('input_name')
if input_name == "MyKeyword":
commit = False
return super().save(commit=commit)
但是,正如您可以看到here和here一样,表单已经使用commit=False
调用,稍后会通过您save_model()
方法保存该对象。 1}}。这就是你得到ModelAdmin
的原因。如果您检查异常的追溯,我很确定错误来自this line。
因此,您应该覆盖AttributeError 'NoneType' object has no attribute 'save'
的{{1}}方法:
ModelAdmin
鉴于您对此回答的评论
它现在正在运作,但我只有一个相关的问题。管理站点仍将在顶部显示绿色横幅,表示"模型已成功添加"。我可以覆盖某些方法,使其为红色并说“#34;模型已存在"?
看起来您要做的并不是覆盖保存方法,而是覆盖controlling form validation。这是完全不同的。你只需要覆盖表单的干净方法。
save_model()
或者,甚至更好,因为看起来你想要clean a single field:
def save_model(self, request, obj, form, change):
if form.cleaned_data.get('input_name') == 'MyKeyword':
return # Don't save in this case
super().save_model(request, obj, form, change)
# And you'll also have to override the `ModelAdmin`'s `save_related()` method
# in the same flavor:
def save_related(self, request, form, formsets, change):
if form.cleaned_data.get('input_name') == 'MyKeyword':
return # Don't save in this case
super().save_related(request, form, formsets, change)
但是,我猜from django import forms
def clean(self):
"""
super().clean()
if self.cleaned_data.get('input_name') == 'MyKeyword':
raise forms.ValidationError("The model already exists")
也是您模型的一个字段,并且您不希望仅在一个表单上但在整个项目中引发此错误。在这种情况下,您要找的是Model validators:
from django import form
def clean_input_name(self):
data = self.cleaned_data['input_name']
if data == 'MyKeyWord':
raise forms.ValidationError("The model already exists")