2011-01-01 5 views
14

Wiem, że is_valid() na formularzu ograniczonym sprawdza, czy wprowadzono wszystkie wymagane dane. Nie tego chcę. Chcę sprawdzić, czy w formularzu jest wypełnione dowolne pole.Django: Jak sprawdzić, czy użytkownik pozostawił wszystkie pola puste (lub wartości początkowe)?

Wszelkie pomysły?

Opracowywanie:

chcę dać użytkownikowi wybór nie wypełnienie formularza w ogóle. Jednakże, jeśli próbują go wypełnić (tj. Zmienili wartość w polu z jego początkowej wartości --- zwykle pustej wartości), chcę ją zweryfikować.

Widok byłoby coś takiego:

def get_opinion(request): 

    if request.method == 'POST': 
     f = OpinionForm(request.POST) 
     if form_is_blank(f): 
      return HttpResponseRedirect(reverse('thank_you_anyway')) 
     elif f.is_valid(): 
      #Process here 
      return HttpResponseRedirect(reverse('thanks_for_participating')) 
    else: 
     initial = {'weekday': date.today().strftime('%A')} 
     f = OpinionForm(initial=initial) 

    return render_to_response(
     'get_opinion.html', 
     {'form': f,}, 
     RequestContext(request) 
    ) 

Co chcę jest form_is_blank() część.

+0

Powinieneś umieścić więcej wyraźnych przypadków użycia dla tego. Jeśli zależy Ci tylko na wypełnieniu co najmniej jednego pola, brzmi to jak coś, co powinno się stać po stronie klienta z niektórymi javascriptami. –

+0

@Matt: Dzięki za sugestię. Opracowałem z pewnym kodem. –

Odpowiedz

22

Zgadnij, muszę odpowiedzieć na własne pytanie.

Najwyraźniej nie nieudokumentowana Form funkcja: has_changed()

>>> f = MyForm({}) 
>>> f.has_changed() 
False 
>>> f = MyForm({}) 
>>> f.has_changed() 
False 
>>> f = MyForm({'name': 'test'}) 
>>> f.has_changed() 
True 
>>> f = MyForm({'name': 'test'}, initial={'name': 'test'}) 
>>> f.has_changed() 
False 

Więc byłoby to zrobić ładnie jako zamiennik form_is_blank() powrócił (oczywiście).

+0

Co zrobić, jeśli chcesz zapisać formularz, jeśli nie jest pusty? Metoda 'has_changed' nie pomogłaby, prawda? –

0

Jeśli umieściłeś required=True w polu formularzy lub w modelu blank=False, więc is_valid() powinien zwrócić False.

3

Powinieneś ustawić required = False dla wszystkich pól w formularzu i zastąpić metodę clean, aby wykonać niestandardową walidację. Aby uzyskać więcej informacji, patrz the current documentation.

+0

Dla mojego konkretnego przypadku użycia, mam wiele formularzy w widoku. Jeśli użytkownik zacznie wypełniać jeden z formularzy, będę potrzebował określonych pól. – Bobort

4

Aby dostać tę pracę funkcjonalność dla podzbioru formularzy stosowanych w rzeczywistym <formy> tagu trzeba także określić

class YourForm(forms.ModelForm): 
    def full_clean(self): 
     if not self.has_changed(): 
      self._errors = ErrorDict() 
      return 

     return super(YourForm, self).full_clean() 

więc gdy użytkownik jest proszony, aby naprawić błędy sprawdzania poprawności nie robi błędy wyświetlania z form którą chcesz sprawdzić tylko, jeśli pewna wartość nie jest pusta (lub domyślna).