Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » Django
  • » Динамическое формирование списка choises (google app engine + django) [RSS Feed]

#1 Сен. 27, 2008 15:33:27

Алекс
От:
Зарегистрирован: 2008-09-27
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Динамическое формирование списка choises (google app engine + django)

Привет всем.
Ситуация касается работы с дажнго в google app engine на локальной сдк.
Хочу передать список параметров в заранее заготовленный choises, но
переданные initial параметры игнорируются, остаются только указанные в
модели.
на примере выглядит так:

class PhoneNumber(db.Model): 
number = db.StringProperty()
phone_type = db.StringProperty(
choices=('work', 'cell'))

class PhoneNumberForm(djangoforms.ModelForm):
class Meta:
model = PhoneNumber

def newp(request):
user = users.GetCurrentUser()
form = PhoneNumberForm(initial={'phone_type':(('1','w'),
('2','r'))})
return respond(request, user, 'addst', {'form': form})
Далее пробовал изменить newp таким образом:
def newp(request,pid): 
user = users.GetCurrentUser()
if pid==1:
cs=(('1','w1'),('2','r1'))
else:
cs=(('1','w else'),('2','r else'))
form = PhoneNumberForm()
l = {'phone_type': djangoforms.ModelChoiceField(PhoneNumber,
choices=cs ,label=u'Телефоны')}
form.base_fields.update(l)

return respond(request, user, 'addst', {'form': form})
т.е. формирую новый элемент словаря и обновляю,
при вызове страницы newp/1 или newp/2
список phone_type то меняется на начальный значение заданные в модели,
то вообще не меняется, после смены цифры, кешируется чтоли. Как можно
еще добиться изменения списка?



Офлайн

#2 Сен. 27, 2008 16:22:35

Алекс
От:
Зарегистрирован: 2008-09-27
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Динамическое формирование списка choises (google app engine + django)

lorien
form = PhoneNumberForm()
После этого инфа из base_fields переносится в fields т.е. тебе надо менять form.fields. Не пойму только, почему ты это делаешь во view - это некрасиво. Переопредели __init__ своей формы и после вызова суперского save делай то, что тебе надо )
далаю во view потому что не смог переопределить __init__, кроме того как мне передать в PhoneNumberForm какие нибудь параметры ? чтобы я по ним смог сменять список ?

p.s. изменил на fields помогло.

но все-таки буду очень благодарен за пример более умного изменения списка и передачи параметров непосредственно в форму.



Отредактировано (Сен. 27, 2008 16:26:10)

Офлайн

#3 Сен. 28, 2008 19:23:44

Oduvan
От:
Зарегистрирован: 2008-07-19
Сообщения: 60
Репутация: +  0  -
Профиль   Отправить e-mail  

Динамическое формирование списка choises (google app engine + django)

я думаю lorien имел ввиду не во view переопределять, а создать новый тип фиелда, наследник…

А я когда то делал так:

from django.newforms.widgets import Select
from django.newforms.fields import Field
from django.newforms.util import smart_unicode

class LambdaField(Field):
def __init__(self, choices,*args,**kwards):
super(LambdaField, self).__init__(*args,**kwards)
self.widget.choices = self.choices = choices
def clean(self,value):
value = super(LambdaField, self).clean(value)
if value in (None, ''):
value = u''
value = smart_unicode(value)
if value == u'':
return value
return value


class LambdaSelect(Select):
def __init__(self, attrs=None, choices=()):
self.attrs = attrs or {}

def _set_choices(self,value):
self._choices = value

def _get_choices(self):
return self._choices()

choices = property(_get_choices, _set_choices)
и это поле и этото виджет потом юзаю

myfield = LambdaField(ref_getfield_function,widget=LambdaSelect())
по моему где то так.



Офлайн

#4 Сен. 28, 2008 19:26:52

Oduvan
От:
Зарегистрирован: 2008-07-19
Сообщения: 60
Репутация: +  0  -
Профиль   Отправить e-mail  

Динамическое формирование списка choises (google app engine + django)

код писался давно… И в питоне я не мастер, так что интересует также мнение специалистов.

Спасибо



Офлайн

#5 Сен. 28, 2008 21:33:20

Oduvan
От:
Зарегистрирован: 2008-07-19
Сообщения: 60
Репутация: +  0  -
Профиль   Отправить e-mail  

Динамическое формирование списка choises (google app engine + django)

Я извиняюсь за флуд… Но в 1.0 не заработало уже ))

Так что вот, уже с небольшими правками

from django.forms.widgets import Select
from django.forms.fields import Field
from django.forms.util import smart_unicode


class LambdaSelect(Select):
def __init__(self, attrs=None, choices=()):
self.attrs = attrs or {}

def _set_choices(self,value):
self._choices = value

def _get_choices(self):
return self._choices()

choices = property(_get_choices, _set_choices)


class LambdaField(Field):
widget = LambdaSelect
def __init__(self, choices,*args,**kwards):
super(LambdaField, self).__init__(*args,**kwards)
self.widget.choices = self.choices = choices
def clean(self,value):
value = super(LambdaField, self).clean(value)
if value in (None, ''):
value = u''
value = smart_unicode(value)
if value == u'':
return value
return value

class TestNewForm(forms.Form):
lambda_field = LambdaField(lambda:(('1','a'),('2','b')))



Офлайн

#6 Сен. 29, 2008 13:49:17

Алекс
От:
Зарегистрирован: 2008-09-27
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Динамическое формирование списка choises (google app engine + django)

Вроде как по виду суть осталась таже, просто странно почему прямое присваивания для стандартного ChoiseField не работает
Спасибо, попробую этот код.



Офлайн

#7 Сен. 29, 2008 22:56:09

qman
От:
Зарегистрирован: 2007-07-02
Сообщения: 444
Репутация: +  0  -
Профиль   Отправить e-mail  

Динамическое формирование списка choises (google app engine + django)

заработал код который опубликовали 14:33:20?



Офлайн

#8 Сен. 29, 2008 22:58:43

qman
От:
Зарегистрирован: 2007-07-02
Сообщения: 444
Репутация: +  0  -
Профиль   Отправить e-mail  

Динамическое формирование списка choises (google app engine + django)

Oduvan
super(LambdaField, self).__init__(*args,**kwards)
подскажите что делает функция super?



Офлайн

#9 Сен. 30, 2008 00:21:52

Oduvan
От:
Зарегистрирован: 2008-07-19
Сообщения: 60
Репутация: +  0  -
Профиль   Отправить e-mail  

Динамическое формирование списка choises (google app engine + django)

вызывает метод у родителя. Подробнее в доку.



Офлайн

#10 Окт. 6, 2008 12:16:56

qman
От:
Зарегистрирован: 2007-07-02
Сообщения: 444
Репутация: +  0  -
Профиль   Отправить e-mail  

Динамическое формирование списка choises (google app engine + django)

Oduvan
class TestNewForm(forms.Form):
lambda_field = LambdaField(lambda:(('1','a'),('2','b')))
подскажите как в данном случае работает:
lambda_field = LambdaField(lambda:(('1','a'),('2','b')))
смогу понять, если бы в определении lambda функции было указано как относительно какой переменной функция определена?
например как в документации
lambda x : x*3
в выше примере постом выше непонятно “(('1','a'),('2','b'))” - является результатом функции? тогда где указано относительно какой переменой (документации - переменная X ) работает функция.
Возможно ли переписать объявление класса LambdaField без оператора lambda?



Отредактировано (Окт. 6, 2008 12:18:38)

Офлайн

  • Начало
  • » Django
  • » Динамическое формирование списка choises (google app engine + django)[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version