Python Django Admin Clean()方法不覆盖值

use*_*190 7 python django admin

也许我在这里遗漏了一些东西,但根据django文档,我应该能够覆盖从clean()方法中的管理表单发送的值.来自django docs

def clean(self):
    from django.core.exceptions import ValidationError
    # Don't allow draft entries to have a pub_date.
    if self.status == 'draft' and self.pub_date is not None:
        raise ValidationError('Draft entries may not have a publication date.')
    # Set the pub_date for published items if it hasn't been set already.
    if self.status == 'published' and self.pub_date is None:
        self.pub_date = datetime.date.today()
Run Code Online (Sandbox Code Playgroud)

我已经删除了我的代码,我只是在管理员中尝试一个基本的例子

Models.py

class Test(models.Model):
name = models.CharField(max_length=255,)

def clean(self):
    self.name = 'Robin Hood'
    return self
Run Code Online (Sandbox Code Playgroud)

因此,当我尝试添加新的测试记录时,如果我将名称字段留空,则应该从clean方法中获取值并保存.

但是会发生什么,表单没有验证,字段仍为空.

我在这里错过了一些明显的东西吗?

Dan*_*man 6

您甚至无法运行模型清理方法.Django将首先运行表单的验证代码,并且由于您的字段未定义blank=True,表单将首先强制执行该约束.

你应该做的是覆盖表单,设置required=Falsename字段,然后编写表单清理方法,将值设置为 - 并返回 - self.cleaned_data:

class TestForm(forms.ModelForm):
    name = forms.CharField(required=False)

    class Meta:
        model = Test

    def clean(self):
        self.cleaned_data['name'] = 'Robin Hood'
        return self.cleaned_data
Run Code Online (Sandbox Code Playgroud)

并在您的管理类中引用该表单:

class TestAdmin(admin.ModelAdmin):
    form = TestForm
Run Code Online (Sandbox Code Playgroud)


pan*_*843 5

clean()从管理站点创建对象时,不会调用模型的方法。clean()仅在之后调用,full_clean()但 Django 管理站点上的保存和对象不调用该函数。

正如您在Mode.clean()官方文档中所见full_clean()被调用以捕获额外的验证错误。

from django.core.exceptions import ValidationError, NON_FIELD_ERRORS
try:
    article.full_clean()
except ValidationError, e:
    non_field_errors = e.message_dict[NON_FIELD_ERRORS]
Run Code Online (Sandbox Code Playgroud)

您需要为此覆盖 save() 方法。