2012-05-17 123 views
5

我想在管理员验证之前填充字段。如何为管理网站创建自定义清理方法?

models.py

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

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) 

最终我想生成整个“代码”字段中,但我仍然获得在管理的错误,该字段为空尽管我可以在shell中看到它的价值(“dadad”)。

我也试过

def clean_code(self): 

,并没有调用该函数在所有。

,我也试过

def save_model(request,....): 
在AdAdmin类

但它不叫,要么。

那么我该怎么办?

+0

不应该干净()有一个级别的缩进是MyAdAdminForm的一部分? – jpic

+0

它在我的代码中,我会在这里更正它。 –

回答

2

除了调用您自定义的clean方法外,Django还会分别验证每个表单字段。这是导致所需字段错误的单个字段检查。有关完整的详细信息,请参阅Form and field validation上的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 

一旦不需要领域,形式验证过程中调用clean_code方法,这样你就可以设置的值存在。

+0

我想保持所需的领域。那是整个问题。 –

+0

据我所知,你会自动生成'code'字段的值,所以你不需要用户输入代码。因此对于这种形式所要求的应该是错误的如果您确实需要用户输入值,那么当用户未输入值时显示错误似乎是正确的行为。 – Alasdair

+0

如果选中'manual_code',我可能不会生成该字段的值。所以如果用户检查它并且没有为'code'插入任何值,它应该向它们返回一个错误。 –

相关问题