Форум сайта python.su
Вопрос из разряда “Нубье атакует”
Сразу говорил - гуглил и форум читал. Но все же вопрос остался актуальным.
Итак, изначально задача стояла такая:
Как сделать в форме выпадающий список по какому то полю(столбцу) таблицы БД?
Как сделать это лучше и изящнее?
Класс формы, который надо реализовать
class OrgForm(forms.Form):
name = forms.CharField (max_length=100)
street = forms.CharField (max_length=50)
house = forms.CharField (max_length=10)
rubr=выпадающий список модель Rubric поле name
city=выпадающий список модель Cities поле name
class OrgForm(forms.Form):
rubr=mdl.Rubric.objects.all().values_list('id','name')
cities=mdl.City.objects.all().values_list('id','name')
...
rubr=forms.CharField(widget=forms.Select(choices=rubr))
city=forms.CharField(widget=forms.Select(choices=cities))
...
def addorg(request):
if request.method=='POST':
form=frm.OrgForm(request.POST)
if form.is_valid():
data=form.cleaned_data
item=mdl.Organisation()
#item.name=data['name']
#item.save()
params={'msg':'Организация "'+item.name.encode('utf-8')+'" добавлена успешно',
'link':'/../db/organisations',
't':2}
return ShowMessage(**params)
else:
form=frm.OrgForm()
cntx = Context ({'form':form,'post':True})
else:
form=frm.OrgForm()
cntx = Context ({'form':form,'post':False})
ldr = loader.get_template('s_add_org.html')
return hr(ldr.render(cntx))
...
<form action="" method="post">
<table width="50%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td>Название организации:</td>
<td>{{ form.name }}*</td></tr>
<tr>
<td>Рубрика:</td>
<td>{{ form.rubr}}*</td></tr>
<tr>
<td>Город:</td>
<td>{{ form.city }}*</td></tr>
<tr>
<td>Улица:</td>
<td>{{ form.street }}*</td></tr>
<tr>
<td>Дом:</td>
<td>{{ form.house }}*</td></tr>
<tr><td colspan="2">* - необходимые поля </td></tr>
<tr><td colspan="2"> </td></tr>
<tr>
<td><div align="center"><input type="submit" value="Добавить" name="submit" style='width: 100px;'></div></td>
<td><div align="center"><a href="/db/organisations"><input type="button" value="Отмена" name="button" style='width: 100px;'></a></div></td>
</tr>
</table>
</form>
...
class Organisation(models.Model):
name = models.CharField (max_length=100)
street = models.CharField (max_length=50)
house = models.CharField (max_length=10)
rubr = models.ForeignKey(Rubric)
city = models.ForeignKey(City)
def _unicode_(self):
return self.name,self.street
class Meta:
ordering = ["name"]
Отредактировано (Май 8, 2010 20:27:17)
Офлайн
Вопрос большой, а ответ один.
На основе Вашей модели просто создайте ModelForm:
class OrgForm(forms.ModelForm):
class Meta:
model = Organisation
Отредактировано (Май 8, 2010 20:36:28)
Офлайн
Благодарю. Но и так я уже делал. Проблема то остается. В выпадающих списках вместо названий рубрик и городов такое - Rubric object, City Object
Модель как выше писал. Форму, как вы написали. Вызов во вьюхе такой:
form=frm.OrgForm(instance=mdl.Organisation.objects.get(pk=1))
cntx = Context ({'form':form,'post':False})
Офлайн
Спасибо, огромное! Помогло. Впредь буду усмотрительней.
Офлайн