2012-05-17 9 views
5

Quiero rellenar un campo antes de la validación en admin.¿cómo puedo crear un método de limpieza personalizado para el sitio de administración?

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) 

finalmente yo quiero generar ese campo entero "código", pero todavía estoy consiguiendo el error en la administración que el campo está vacío aunque puedo ver el valor de esto ("dadad") en el caparazón.

También probé

def clean_code(self): 

y no estaba llamando esa función en absoluto.

y también he intentado

def save_model(request,....): 

en la clase AdAdmin pero no estaba llamando a eso.

¿Qué debo hacer?

+0

¿No debería limpiar() tener un nivel de sangría para ser parte de MyAdAdminForm? – jpic

+0

tiene en mi código, lo corregiré aquí. –

Respuesta

2

Además de llamar a su método personalizado clean, Django valida cada campo de formulario individualmente. Es la verificación de campo individual que causa el error de campo requerido. Para obtener más información, consulte los documentos de Django en Form and field validation.

Si no necesita la entrada del usuario en el campo de código, puede anular el método __init__ del formulario y establecer 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 

Una vez que no se requiere el campo, la forma se llame al método clean_code durante la validación, lo que puede establecer el valor allí.

+0

Quería mantener el campo requerido. ese fue todo el problema –

+0

Según tengo entendido, está generando automáticamente el valor del campo 'código', por lo que no necesita que el usuario ingrese el código. Por lo tanto, debe ser falso para esta forma. Si requiere que el usuario ingrese el valor, entonces mostrar un error cuando el usuario no ha ingresado un valor parece ser el comportamiento correcto. – Alasdair

+0

Puede que no genere el valor del campo si está marcado 'manual_code'. entonces, si el usuario lo revisó y no insertó ningún valor para 'code', debería devolverle un error. –

Cuestiones relacionadas