Antazy

пятница, 12 июня 2009 г.

Django Form Choices: select options из БД

На одном сайте на Django весит форма регистрации на закрытые вечеринки, в общем обычный contact form, но только периодически меняется название этих вечеринок.

Так выглядит обычный ChoiceField (froms.py):
from django import forms
PARTY_CHOICES = (
(1, u'Вечеринка 1'),
(2, u'Вечеринка 2'),
)
class ContactForm(forms.Form):
name = forms.CharField(required=True)
phone = forms.CharField(required=True)
party = forms.ChoiceField(choices=PARTY_CHOICES)

Для того чтобы хранить данные в БД создал модель (models.py):

class Party(models.Model):    
name = models.CharField('Название', max_length=200)
def __unicode__(self):
return u'%s' % (self.name)

И заменил в форме PARTY_CHOICES на:


from django import forms
from models import Party
PARTY_CHOICES = [
(party.id, party.name) for party in Party.objects.all()
]
class ContactForm(forms.Form):
name = forms.CharField(required=True)
phone = forms.CharField(required=True)
party = forms.ChoiceField(choices=PARTY_CHOICES)

Дальше в admin.py добавил admin.site.register(Party), и всё работает. Ура!

Но как бы не так, PARTY_CHOICES кэшируется в forms.py, то есть при добавление/изменении вечеринок в базе, форма меняется только после рестарта Джанги.

Решение оказалось ещё проще - использование forms.ModelChoiceField (forms.py):
...
party = forms.ModelChoiceField(queryset=Party.objects.all())

Теперь с ModelChoiceField всё работает как надо, форма меняется сразу после изменении в админке, но вот только остался вопрос с кэшированием в forms.py …

Ярлыки:

Комментарии: 1:

Отправить комментарий

Ссылки на это сообщение:

Создать ссылку

<< Главная страница