Python Django管理站点修改保存

Python Django管理站点修改保存,python,django,model,django-admin,overriding,Python,Django,Model,Django Admin,Overriding,在管理站点中,我有一个自定义表单。但是,我希望重写save方法,这样,如果输入了某个关键字,我就不会将其保存到数据库中。这可能吗 class MyCustomForm (forms.ModelForm): def save(self, commit=True): input_name = self.cleaned_data.get('input_name', None) if input_name == "MyKeyword":

在管理站点中,我有一个自定义表单。但是,我希望重写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' 
编辑 在此之后:

我试过:

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    
但是,如果输入名称为“MyKeyword”

则管理员站点仍然会创建一个新条目,
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)
但是,正如您所看到的和所看到的,表单已经用
commit=False
调用,对象稍后通过
ModelAdmin
save\u model()
方法保存。这就是为什么您得到了AttributeError'NoneType'对象没有属性'save'。如果您检查异常的回溯,我很确定错误来自

因此,您还应该重写
ModelAdmin
save\u model()
方法:

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)

鉴于您在回答中的评论

它现在正在工作,但我只有一个相关的问题。管理站点仍然会在顶部显示一条绿色横幅,上面写着“模型添加成功”。我是否可以重写某个方法,使其显示为红色并显示“模型已存在”

看起来您要做的不是重写save方法,而是重写save方法。这是完全不同的。您只需重写表单的clean方法

from django import forms

def clean(self):
    """
    super().clean()
    if self.cleaned_data.get('input_name') == 'MyKeyword':
        raise forms.ValidationError("The model already exists")
或者,甚至更好,因为看起来您想要:

然而,我猜
输入\u name
也是模型的一个字段,您不希望仅在一个表单上,而是在所有项目中引发此错误。在这种情况下,您需要的是:


那么这个代码有什么问题呢?如果输入\u name!=“MyKeyword”:super(MyCustomForm,self).save(commit=commit),但除此之外,它应该像您编写的那样工作。我尝试过这样做,但错误是:AttributeError'NoneType'对象没有属性'save',那么您的ModelForm可能没有返回要保存的对象:它返回的是“None”。阅读这个答案。它现在起作用了,但我只有一个相关的问题。管理站点仍然会在顶部显示一条绿色横幅,上面写着“模型添加成功”。我是否可以重写某个方法,使其显示为红色并显示“模型已存在”?当然可以。但看起来这并不是你真正想做的。为什么从一开始你就不说你想控制表单验证?请参阅和更新我的答案。另外,当
input\u name
设置为关键字时,是否确实要引发错误?或者是可变的?也许是一个关键字列表?可能是从数据库中检索到的数据?也许你只是想让这个领域独一无二?如果是这样的话,你为什么要努力隐藏问题的关键信息?
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")
from django.core.exceptions import ValidationError

def validate_input_name(value):
    if value == 'MyKeyword':
        raise ValidationError("The model already exists")