Найти - Пользователи
Полная версия: Как работает prefix в форме?
Начало » Django » Как работает prefix в форме?
1
Ziberbulger
Здравствуйте. Такая проблема. У меня на странице форма и формсет.
<form action="" method="post">
<table width="35%" 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">&nbsp; </td></tr>

<tr><td>Телефоны:</td><td></td></tr>
{% for telform in telformset %}
<tr>
<td></td><td>{{ telform.phone }}</td></tr>
{% endfor %}

<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>
Так вот. Когда обрабатываю request.POST вылетает ошибка ‘TelForm’ object has no attribute ‘__name__’
Во вьюхе код такой:
telephones=mdl.Telephones.objects.filter(org=request.GET[''])
if request.method=='POST':
EntryFormSet=formset(frm.TelForm(request.POST, prefix="telephone"),extra=len(telephones))
form=frm.OrgForm(request.POST,prefix="organisation")
telformset=EntryFormSet()
if form.is_valid() and telformset.is_valid():
...
А модель (форма по ней (ModelForm)):
class Telephones (models.Model):
phone = models.CharField(max_length=15)
org = models.ForeignKey(Organisation)

class Meta:
ordering = ["org"]

def __unicode__(self):
return self.phone
Собственно вопрос: как правильно “раскидать” один POST на две формы? Читал, что нужно использовать префиксы, но не могу понять как они работают. Подскажите, что и где нужно подправить, пожалуйста.
Ziberbulger
Видать, кстати, дело не в префиксе:
Exception Value: ‘TelForm’ object has no attribute ‘__name__’
Exception Location: d:\python26\lib\site-packages\django-1.1.1-py2.6.egg\django\forms\formsets.py in formset_factory, line 310
310. return type(form.__name__ + ‘FormSet’, (formset,), attrs)

Как исправить, подскажите?
Александр Кошелев
Может быть вы наконец покажите код, который создает формсет?

Судя по фотографии, вы в фабрику передаете объект формы, а не класс.
Ziberbulger
да, переделал вот так:
def changeorg(request): #Изменение организации
telephones=mdl.Telephones.objects.filter(org=request.GET[''])
if request.method=='POST':
EntryFormSet=formset(frm.TelForm,extra=len(telephones))
form=frm.OrgForm(request.POST,prefix="org")
telformset=EntryFormSet(request.POST,prefix="tel")
if form.is_valid() and telformset.is_valid():
...
else:
EntryFormSet=formset(frm.TelForm,extra=len(telephones))
org=mdl.Organisation.objects.filter(id=request.GET[''])
telformset=EntryFormSet(prefix='tel')
form=frm.OrgForm(initial={
'name':org[0].name,
'street':org[0].street,
'house':org[0].house,
'rubr':org[0].rubr.id,
'city':org[0].city.id
},prefix='org')
...
Теперь когда приходит пост, вылетает ошибка: ValidationError с текстом:
raise ValidationError('ManagementForm data is missing or has been tampered with')
Как исправить это?
Ziberbulger
Ну еще у меня в самом начале строка:
from django.forms.formsets import formset_factory as formset
Ziberbulger
по докам я так понял, надо что то с ManagementForm мутить, но вот что то не пойму с какой стороны зайти.
Добавляю в шаблон {{ telformset.management_form }} и ничего не происходит. может не туда добавляю?
А еще, судя по-всему, надо какие то дополнительные атрибуты прописывать … Короче, пока так и не разобрался …
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB