如何为管理站点创建自定义清理方法?

dad*_*yad 5 python django django-models django-forms django-admin

我想在管理员验证之前填充一个字段.

models.py

class Ad(models.Model):
    .....
    manual_code  = models.BooleanField("Manual Code", default=False)
    code          = models.TextField("Code")
Run Code Online (Sandbox Code Playgroud)

admin.py

class MyAdAdminForm(forms.ModelForm):
    class Meta:
        model = Ad

    def clean(self):
        cleaned_data = self.cleaned_data
        cleaned_data['code'] = "dadad"
        print cleaned_data
        return cleaned_data

class AdAdmin(admin.ModelAdmin):
    form = MyAdAdminForm

admin.site.register(Ad, AdAdmin)
Run Code Online (Sandbox Code Playgroud)

最终我想生成整个"代码"字段,但我仍然在管理员中得到错误,该字段为空虽然我可以在shell中看到它的值("dadad").

我也试过了

def clean_code(self):
Run Code Online (Sandbox Code Playgroud)

它根本没有调用那个功能.

而且我也试过了

def save_model(request,....):
Run Code Online (Sandbox Code Playgroud)

在AdAdmin类中,但它也没有调用它.

所以我该怎么做?

Ala*_*air 2

除了调用您的自定义clean方法之外,Django 还会单独验证每个表单字段。这是导致所需字段错误的单独字段检查。有关完整详细信息,请参阅有关表单和字段验证的Django 文档。

如果您不需要用户在代码字段中输入,您可以覆盖表单的__init__方法,并设置required=False.

class MyAdAdminForm(forms.ModelForm):
    class Meta:
        model = Ad

    def __init__(self, *args, **kwargs):
        super(MyAdAdminForm, self).__init__(*args, **kwargs)
        self.fields['code'].required = False
Run Code Online (Sandbox Code Playgroud)

一旦不需要该字段,表单在验证期间调用该clean_code方法,因此您可以在那里设置值。