Форум сайта python.su
Привет всем.
Ситуация касается работы с дажнго в 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})
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})
Офлайн
lorienдалаю во view потому что не смог переопределить __init__, кроме того как мне передать в PhoneNumberForm какие нибудь параметры ? чтобы я по ним смог сменять список ?После этого инфа из base_fields переносится в fields т.е. тебе надо менять form.fields. Не пойму только, почему ты это делаешь во view - это некрасиво. Переопредели __init__ своей формы и после вызова суперского save делай то, что тебе надо )form = PhoneNumberForm()
Отредактировано (Сен. 27, 2008 16:26:10)
Офлайн
я думаю 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())
Офлайн
код писался давно… И в питоне я не мастер, так что интересует также мнение специалистов.
Спасибо
Офлайн
Я извиняюсь за флуд… Но в 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')))
Офлайн
Вроде как по виду суть осталась таже, просто странно почему прямое присваивания для стандартного ChoiseField не работает
Спасибо, попробую этот код.
Офлайн
заработал код который опубликовали 14:33:20?
Офлайн
Oduvanподскажите что делает функция super?
super(LambdaField, self).__init__(*args,**kwards)
Офлайн
вызывает метод у родителя. Подробнее в доку.
Офлайн
Oduvanподскажите как в данном случае работает:
class TestNewForm(forms.Form):
lambda_field = LambdaField(lambda:(('1','a'),('2','b')))
lambda_field = LambdaField(lambda:(('1','a'),('2','b')))
lambda x : x*3
Отредактировано (Окт. 6, 2008 12:18:38)
Офлайн