Уведомления

Группа в Telegram: @pythonsu

#1 Май 8, 2010 20:25:05

Ziberbulger
От:
Зарегистрирован: 2010-05-08
Сообщения: 76
Репутация: +  0  -
Профиль   Отправить e-mail  

Формы - выпадающий список

Вопрос из разряда “Нубье атакует”
Сразу говорил - гуглил и форум читал. Но все же вопрос остался актуальным.
Итак, изначально задача стояла такая:
Как сделать в форме выпадающий список по какому то полю(столбцу) таблицы БД?
Как сделать это лучше и изящнее?
Класс формы, который надо реализовать

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
Пробовал всяко-разно. Пробовал через ModelChoiceField - выдает списки типа Rubric object, City object
Причем по количеству они совпадают, но вот поле 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))
Возникли вопросы:
1. почему в values_list нужно указывать больше одного поля (хотя выводится только последнее, но Django не дает указать одно)
2. Именно так люди и делают выпадающие списки???

if answer2==False:
Как грамотнее сделать?
Как это потом прочитать и занести в Таблицу org id_rubr и id_city как внешний ключ?
Как это правильно должно выглядеть в шаблоне?

Если нужно:
view.py:
...
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))
s_add_org.html (шаблон):
...
<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">&nbsp; </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>
...
models.py
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)

Офлайн

#2 Май 8, 2010 20:33:31

vaxXxa
От: Kyiv, Ukraine
Зарегистрирован: 2009-06-16
Сообщения: 278
Репутация: +  0  -
Профиль   Отправить e-mail  

Формы - выпадающий список

Вопрос большой, а ответ один.
На основе Вашей модели просто создайте ModelForm:

class OrgForm(forms.ModelForm):
class Meta:
model = Organisation
И будет там и выпадающий список и все остальное.
Только вьюшку надо будет чуток подредактировать. (почитайте доки)
Удачки…



Отредактировано (Май 8, 2010 20:36:28)

Офлайн

#3 Май 9, 2010 08:44:19

Ziberbulger
От:
Зарегистрирован: 2010-05-08
Сообщения: 76
Репутация: +  0  -
Профиль   Отправить e-mail  

Формы - выпадающий список

Благодарю. Но и так я уже делал. Проблема то остается. В выпадающих списках вместо названий рубрик и городов такое - Rubric object, City Object
Модель как выше писал. Форму, как вы написали. Вызов во вьюхе такой:

form=frm.OrgForm(instance=mdl.Organisation.objects.get(pk=1)) 
cntx = Context ({'form':form,'post':False})
в шаблоне как выше …

Вот меня и смутило. что же я не так делаю?

п.с. и еще если можно, подскажите как сделать, чтобы это комбобоксы были заднной длины (возможно ли это вообще?)



Офлайн

#4 Май 10, 2010 17:02:51

Ziberbulger
От:
Зарегистрирован: 2010-05-08
Сообщения: 76
Репутация: +  0  -
Профиль   Отправить e-mail  

Формы - выпадающий список

Спасибо, огромное! Помогло. Впредь буду усмотрительней.



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version