2009-03-17 10 views
18

Dodaję niestandardową weryfikację do moich formularzy i pól niestandardowych w mojej aplikacji Django. Chciałbym móc modyfikować wartość pola przy wyzwalaniu błędu. Na przykład, jeśli wystąpił błąd, formularz powinien zostać wyświetlony ponownie z wartością pola poprawioną przez clean() i komunikatem o błędzie "Dane zostały poprawione poniżej." Kliknij Zapisz ponownie, aby potwierdzić, czy zmiany są prawidłowe "Modyfikuj wartość pola formularza Django podczas czyszczenia()

I Próbowałem przywrócić zmodyfikowane dane w clean_data [] w ten sposób, ale to nie działa. Poprawnie wyświetla błąd, ale wartość pola nie jest aktualizowana poprawionym kodem HTML, gdy formularz jest wyświetlany ponownie.

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 

Chciałbym też zrobić to samo z pola, ale ponieważ błędy są wywoływane przez wyjątku, nie dostanę szansę na powrót skorygowaną wartość. Podobnie jak w przypadku metody clean(), błąd jest wyświetlany poprawnie, ale wartość nie jest aktualizowana.

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 

Odpowiedz

6

dane zmiana siebie w czystej metody, aby zmienić wartość, która zostanie wyświetlony

+6

To działa, ale jest nieudokumentowane i brzydko jest modyfikować obiekt QueryDict bezpośrednio. Dodatkowo musiałem napisać funkcję pomocnika, aby zmodyfikować tylko do odczytu QueryDict ... – user27478

+1

Tak, ale nie ma oficjalnego sposobu, aby to zrobić. – user51463

+3

@ user27478: Czy możesz zamieścić swoje rozwiązanie? – Don

-1

Jeśli formularz jest model tworzą lepsze podejście byłoby uzyskać instancji i skorygować te dane zamiast:

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: Nie jestem pewien, czy to faktycznie zadziała ... Nie jestem pewien, czy formularz spowoduje zmiany odbioru.

+0

To nie działa! – digz6666

0

ten sposób próbowałem i działa dla mnie:

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

Jeśli wystąpi błąd sprawdzania poprawności, nie działa! – digz6666

3

sposób zaktualizować wartość w czysty() jest aktualizacja wartości w słowniku danych formularza:

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

to działa na pewno.

+1

To nie działa z Django 2.0 – Daniel

+0

to też nie było w wersji 1.11! –

Powiązane problemy