Django 1,3 - сохранение нескольких форм делает частичное сохранение
У меня проблемы с созданием нескольких форм в Django. У меня есть две модели, Space
а также Entity
, Каждое пространство может иметь N связанных с ним объектов.
Я создал форму с двумя ModelForms и написал вид, который работает "по-видимому". Это сохраняет форму пространства, но не данные формы объекта. Мне не имеет смысла, что сохранение форм делает его "частичным" хранением.
views.py
def all(items):
import operator
return reduce(operator.and_, [bool(item) for item in items])
def create_space(request):
"""
Create new space with its related entities. In this view the author
field is automatically filled.
"""
space_form = SpaceForm(request.POST or None, request.FILES or None)
entity_forms = [EntityForm(request.POST or None, prefix=str(x)) for x in range(0,3)]
if request.POST:
space_form_uncommited = space_form.save(commit=False)
space_form_uncommited.author = request.user
if space_form.is_valid() and all([ef.is_valid() for ef in
entity_forms]):
new_space = space_form_uncommited.save()
for ef in entity_forms:
ef_uncommited = ef.save(commit=False)
ef_uncommited.space = new_space
ef_uncommited.save()
# We add the created spaces to the user allowed spaces
space = get_object_or_404(Space, name=space_form_uncommited.name)
request.user.profile.spaces.add(space)
return redirect('/spaces/' + space.url)
return render_to_response('spaces/space_add.html',
{'form': space_form,
'entityform_0': entity_forms[0],
'entityform_1': entity_forms[1],
'entityform_2': entity_forms[2]},
context_instance=RequestContext(request))
forms.py
class SpaceForm(ModelForm):
"""
"""
class Meta:
model = Space
class EntityForm(ModelForm):
"""
"""
class Meta:
model = Entity
Код шаблона вставлен сюда, потому что он слишком длинный.
2 ответа
РЕШИТЬ
Возникла какая-то проблема с использованием форм RAW. Я конвертировал EntityForm в ModelFormSet и после этого, Entities был сохранен.
Исправлено также замедление entity.space, в котором хранилось NoneObject
,
Финальный код:
views.py
def create_space(request):
space_form = SpaceForm(request.POST or None, request.FILES or None)
entity_forms = EntityFormSet(request.POST or None, request.FILES or None,
queryset=Entity.objects.none())
if request.POST:
space_form_uncommited = space_form.save(commit=False)
space_form_uncommited.author = request.user
if space_form.is_valid() and entity_forms.is_valid():
new_space = space_form_uncommited.save()
space = get_object_or_404(Space, name=space_form_uncommited.name)
ef_uncommited = entity_forms.save(commit=False)
for ef in ef_uncommited:
ef.space = space
ef.save()
# We add the created spaces to the user allowed spaces
request.user.profile.spaces.add(space)
return redirect('/spaces/' + space.url)
return render_to_response('spaces/space_add.html',
{'form': space_form,
'entityformset': entity_forms},
context_instance=RequestContext(request))
forms.py
from django.forms.models import modelformset_factory
EntityFormSet = modelformset_factory(Entity, extra=3)
Вам не нужно создавать объекты, ModelForm сделает это за вас, поэтому удалите строки space = Space()
а также entity = Entity()
и не пропустите instance
к формам.
И не изобретай all
функция, это уже встроенный Python.:-)