2009-03-17 3 views
18

Aggiungo la convalida personalizzata ai miei moduli e campi personalizzati nella mia app Django. Mi piacerebbe essere in grado di modificare il valore di un campo quando si innesca un errore. Ad esempio, se si verifica un errore, il modulo deve essere nuovamente visualizzato con il valore del campo corretto da clean() e un messaggio di errore "I dati sono stati corretti di seguito. Fai di nuovo clic su Salva per confermare se queste modifiche sono OK"Modifica valore di un campo modulo Django durante la pulizia()

I Ho provato a restituire i dati modificati in clean_data [] come questo, ma non funziona. Visualizza l'errore correttamente, ma il valore del campo non viene aggiornato con l'HTML corretto quando il modulo viene nuovamente visualizzato.

class T34AtividadeForm(ModelForm): 
    def clean(self): 
     # Return cleaned html 
     error,html = fix_imgs(cleaned_data.get("a34_descricao")) 
     if error: 
      msg = u'Data has been corrected below. Click save again to confirm if these changes are OK'; 
      self._errors['a34_descricao'] = ErrorList([msg]) 
      # This doesn't work 
      cleaned_data["a34_descricao"] = html 
      # This doesn't work either 
      self.a34_descricao = html 

    return cleaned_data 

Mi piacerebbe anche fare la stessa cosa con un campo, ma dal momento che gli errori sono attivati ​​da eccezioni, non ottengo la possibilità di restituire il valore corretto. Come il metodo clean(), l'errore viene visualizzato correttamente, ma il valore non viene aggiornato.

class HTMLField(CharField): 
    widget = HTMLTextarea 

    def clean(self, value): 
     value = super(HTMLField,self).clean(value) 
     error,html = fix_imgs(value) 
     if error: 
      # This doesn't work 
      self.value = html 
      raise forms.ValidationError(u'Data has been corrected below. Click save again to confirm if these changes are OK.') 
     return html 

risposta

6

dati cambiamento sé nel metodo pulito per modificare il valore che viene visualizzato

+6

Questo funziona, ma non è documentato e risulta brutto modificare direttamente l'oggetto QueryDict. Inoltre, ho dovuto scrivere una funzione di supporto per modificare QueryDict in sola lettura .... – user27478

+1

Sì, ma non c'è un modo ufficiale per farlo. – user51463

+3

@ user27478: puoi pubblicare la tua soluzione? – Don

-1

Se il modulo è un modello di formare un approccio migliore sarebbe quello di ottenere un'istanza e correggere i dati, invece:

inst = my_form.save(commit=False) 
if inst.a34_stuff is None: #or incorrect 
    inst.a34_stuff = "corrected" 
    request.user.message_set.create(message = "Error corrected") 
    return HttpResponseRedirect(reverse('your_url_name', 
      args=[]) 

PS: Non sono sicuro che funzioni effettivamente ... Non sono sicuro che il modulo rispecchi le modifiche.

+0

Non funziona! – digz6666

0

questo è il modo che ho provato e funziona per me:

inst = my_form.save(commit=False) 
if not inst.a34_stuff: # or incorrect 
    inst.data["a34_stuff"] = "corrected" 
+1

Se c'è qualche errore di validazione, non funziona! – digz6666

3

modo per aggiornare il valore in un ambiente pulito() è aggiornare il valore nel dizionario dei dati di forma:

self.data["a34_stuff"] = "html" 

questo funziona di sicuro.

+1

Questo non funziona con Django 2.0 – Daniel

+0

non in 1,11 troppo! –