Django管理站点修改保存

时间:2016-07-15 14:36:41

标签: python django model django-admin override

在管理网站中,我有一个自定义表单。但是,我想覆盖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”

,管理站点仍然会创建一个新条目

1 个答案:

答案 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)

但是,正如您可以看到herehere一样,表单已经使用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")