Z archiwum Django: Znikające elementy listy.

Poniedziałek, 2011-12-05 @ 19:25 | edit
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...