2010-03-01 13 views
7

Mam formularz Django, który pozwala użytkownikowi zmienić hasło. Uważam, że na błędach formularza na polach jest to, że dane * są nadal w nich zawarte.Czyszczenie pól formularza Django w przypadku błędu sprawdzania formularza?

Próbowałem już kilku metod usuwania form.data, ale nadal otrzymuję komunikat wyjątku This QueryDict instance is immutable.

Czy istnieje właściwy sposób na wyczyszczenie pojedynczych pól formularza lub całego zestawu danych formularza od clean()?

+0

można użyć javascript, który działałby w 95% przypadków zgodnie z: http://www.w3schools.com/browsers /browsers_stats.asp; przykład: http: //www.learningjquery.com/2007/08/clearing-form-data – miku

Odpowiedz

0

Jeśli potrzebujesz dodatkowej weryfikacji za pomocą więcej niż jednego pola formularza, zastąp metodę .clean(). Ale jeśli jest to tylko jedno pole, możesz utworzyć metodę clean_field_name().

http://docs.djangoproject.com/en/1.1/ref/forms/validation/#ref-forms-validation

+0

Igor, wiem jak potwierdzić formularz. Problem polega na tym, że sprawdzanie poprawności nie powiedzie się, chcę, aby pole formularza było puste, a nie dane dostarczone przez użytkownika. – ChrisW

+3

Igor jest jednak na dobrej drodze, ChrisW. IMO, powinieneś użyć metody clean() do sprawdzenia poprawności dwóch haseł - a jeśli nie są poprawne, wyczyść pola self.data , przed podniesieniem błędu sprawdzania poprawności. – pithyless

+0

Czy ktoś mógłby rozwinąć trochę więcej. Kiedy próbuję self.data ['field'] = None tuż przed podniesieniem validationError nic się nie dzieje, a błąd sprawdzania poprawności nie został nawet podniesiony. – joshcartme

-2

Chyba trzeba użyć JavaScript, aby ukryć lub usunąć tekst z pojemnika.

+0

Z pewnością musi istnieć sposób na wykonanie tej strony po stronie serwera ... w zależności od JavaScript po stronie klienta jest dość nieporządnym sposobem na osiągnięcie tego. – ChrisW

2

Ktoś mi pokazał, jak to zrobić. Ta metoda działa dla mnie:

post_vars = {} 
post_vars.update(request.POST) 
form = MyForm(post_vars, auto_id='my-form-%s') 
form.data['fieldname'] = '' 
form.data['fieldname2'] = '' 
+1

To działa, ale nie jest zbyt czyste, ponieważ robisz to na poziomie widoków. IMO, powinieneś podklasnąć domyślny formularz logowania i zastąpić metodę clean() zgodnie z sugestią Igora. Oznacza to, że najpierw sprawdź poprawność; wyczyść odpowiednie pola self.data, a na koniec wywołaj błąd sprawdzania poprawności. – pithyless

+0

Masz jakąś szansę na opracowanie? Nadal dostaję niezmienne błędy querydict. – joshcartme

+0

post_vars.update (request.POST) jest mniej czystym sposobem wykonywania polecenia dict (request.POST). W obu przypadkach wartości przesłane przez formularz, który nie zastąpisz form.data, wyświetlają się w renderowanej formie jako u '' (nie wiesz, dlaczego tak się dzieje). Użycie request.POST.copy() zgodnie z sugestią @Ian działało jak czar. – Josh

6

odniesieniu do niezmiennego błędu QueryDict, Twój problem jest prawie na pewno, że po utworzeniu instancji formularz tak:

form = MyForm(request.POST) 

Oznacza to, że form.data jest rzeczywista QueryDict stworzony z POST vars. Ponieważ samo żądanie jest niezmienne, pojawia się błąd, gdy próbujesz coś w nim zmienić. W tym przypadku, mówiąc

form.data['field'] = None 

jest dokładnie to samo, co

request.POST['field'] = None 

aby dostać się formularz, który można modyfikować, chcesz skonstruować go tak:

form = MyForm(request.POST.copy()) 
+0

Należy zauważyć, że w przypadku pola pliku lub pola obrazu w formularzu należy ustawić plik form.files, a nie form.data w ten sam sposób. – krypto07

0

Właśnie stworzyłem formularz.

Spróbuj:

form = AwesomeForm() 

a następnie uczynić go.

0

Django ma widżet, który to robi: https://docs.djangoproject.com/en/1.8/ref/forms/widgets/#passwordinput

teraz, jeśli nie pracujesz z hasłami można zrobić coś takiego:

class NonceInput(Input): 
    """ 
    Hidden Input that resets its value after invalid data is entered 
    """ 
    input_type = 'hidden' 
    is_hidden = True 

    def render(self, name, value, attrs=None): 
     return super(NonceInput, self).render(name, None, attrs) 

Oczywiście można dokonywać żadnych Django widget zapomnieć jego wartość tylko przez przesłonięcie jej metody renderowania (zamiast wartości, którą przekazałem Brak w super połączeniu.)

Powiązane problemy