2012-05-17 8 views
5

Voglio popolare un campo prima della convalida in admin.come posso creare un metodo pulito personalizzato per il sito di amministrazione?

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) 

alla fine voglio generare tutto quel "codice" di campo, ma sto ancora ottenere l'errore di amministrazione che il campo è vuoto anche se posso vedere il valore di esso ("dadad") nella shell.

Ho anche provato

def clean_code(self): 

e non stava chiamando quella funzione a tutti.

e ho anche provato

def save_model(request,....): 

nella classe AdAdmin ma non stava chiamando che o.

quindi cosa devo fare?

+0

Non dovrebbe pulire() avere un livello di indentazione per far parte di MyAdAdminForm? – jpic

+0

ha nel mio codice, lo correggerò qui. –

risposta

2

Oltre a chiamare il metodo personalizzato clean, Django convalida ogni campo del modulo individualmente. È il singolo controllo sul campo che sta causando l'errore di campo richiesto. Per i dettagli completi vedi i documenti Django su Form and field validation.

Se non si richiede l'immissione dell'utente nel campo codice, è possibile ignorare il metodo __init__ del modulo e impostare 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 volta che il campo non è obbligatorio, la forma sarà chiamare il metodo clean_code durante la convalida, in modo da poter impostare il valore lì.

+0

Volevo mantenere il campo richiesto. quello era l'intero problema. –

+0

A quanto ho capito, si genera automaticamente il valore del campo 'code', quindi non è necessario che l'utente inserisca il codice. Pertanto richiesto dovrebbe essere falso per questo modulo. Se si richiede all'utente di inserire il valore, quindi mostrare un errore quando l'utente non ha inserito un valore sembra essere il comportamento corretto. – Alasdair

+0

Non posso generare il valore del campo se il 'manual_code' è spuntato. quindi se l'utente ha controllato e non ha inserito alcun valore per 'code', dovrebbe restituire loro un errore. –

Problemi correlati