Z archiwum Django: Znikające elementy listy.
W ?Archium X? Mulder i Scully prowadzili śledztwa, które nie dały się wyjaśnić na drodze konwencjonalnego rozumowania (via
wikipedia). Nie inaczej jest podczas codziennych potyczek z programowaniem (i nie tylko). Czasami zdarzają się przypadki, które na pierwszy rzut oka powinny zachowywać się całkiem inaczej....
Weźmy przykładowo formę (np.
ModelForm) prezentującą relacje
Many to many. W momencie gdy submitujemy taką formę, wewnątrz
request.POST (lub
form.data) powinniśmy znaleźc listę numerów id obiektów, które wybraliśmy:
np. taką:
... 'permissions': [u'1', u'5', u'18', u'24'], ...
Idąc tym tokiem rozumowania, wewnątrz
request.POST['permissions'] powinna się znaleźć owa lista. Ale czy na pewno?
I tak, i nie....
Tak bo tam faktycznie, będzie lista, ale jeżeli spróbujemy wyciągnąć ją w pokazany wyżej sposób otrzymamy co innego:
>>> print request.POST['permissions']
24
Teraz pytanie ? gdzie podział się wiersz przypisujący
24 do
'permissions' zamiast powyższej listy? Nigdzie. Wystarczy zapamię?ać, że
request.POST to nie jest zwykły
słownik a
QueryDict czyli bazujący na słowniku inny typ danych i w przypadku list
__getitem__ zwróci tylko ostatni jej element. Aby pobrać całą listę należy to zrobić tak:
>>> print request.POST.getlist('permissions')
[u'1', u'5', u'18', u'24']
I to by było na tyle...