2011-09-29 8 views
13

Widziałem kilka kodów próbki jak:Różnica między cleaned_data i cleaned_data.get w Django

def clean_message(self): 
    message = self.cleaned_data['message'] 
    num_words = len(message.split()) 
    if num_words < 4: 
     raise forms.ValidationError("Not enough words!") 
    return message 

i kilka przykładów takich jak:

def clean(self): 
    username = self.cleaned_data.get('username') 
    password = self.cleaned_data.get('password') 
    ... 
    self.check_for_test_cookie() 
    return self.cleaned_data 

Jaka jest różnica między tymi dwoma?

+0

dokładnie to pytanie (i odpowiedź) potrzebowałem. Nie używałam dictionary.get(), ponieważ dla całego mojego rozwoju zawsze używałam słownika skrótu [klucz] – KobeJohn

Odpowiedz

28

.get() jest w zasadzie skrótem do uzyskania elementu z dictionary. Zwykle używam .get(), gdy nie jestem pewien, czy wpis w słowniku będzie tam. Na przykład:

>>> cleaned_data = {'username': "bob", 'password': "secret"} 
>>> cleaned_data['username'] 
'bob' 
>>> cleaned_data.get('username') 
'bob' 
>>> cleaned_data['foo'] 
    Traceback (most recent call last): 
     File "<stdin>", line 1, in <module> 
    KeyError: 'foo' 
>>> cleaned_data.get('foo') # No exception, just get nothing back. 
>>> cleaned_data.get('foo', "Sane Default") 
'Sane Default' 
+0

W kontekście formularzy Django, ten ostatni wiersz kodu sugeruje, że możesz podać wartość domyślną dla w ten sposób uformuj pole. Ale jeśli czegoś nie brakuje, to nie działa, przynajmniej nie w Django 1.8. Opcjonalne pole ('required = False') zawiera pusty ciąg' ''', jeśli nie jest ustawiony przez klienta. –

+0

@ BobStein-VisiBone Widzę, dlaczego to może być mylące. Zawarłem to, ponieważ moja odpowiedź była bardziej skoncentrowana na 'cleaned_data' będącym" Just a Dictionary ". Jednakże, jeśli masz pole opcjonalne, wpis w słowniku będzie istnieć, a 'get()' nie użyje "Sane Default". Jeśli jednak masz pole, które może, ale nie musi * istnieje *, to wpis w słowniku może istnieć lub nie. Dlatego wymaga ostrożności i, w moim przypadku, użycie 'get()', aby nie rzucić wyjątku. –

Powiązane problemy