2011-05-27 62 views
1

我在django中遇到了一些麻煩,我有兩個型號,SpaceEntity。每個空間可以有N個與之相關的實體。django 1.3 - 保存多個表單不會保存部分

我用兩個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 

模板代碼粘貼here因爲太長。

+2

EntityForm應該是一個ModelFormset,不是的ModelForm。請參閱https://docs.djangoproject.com/en/dev/topics/forms/formsets/ – 2011-05-27 07:53:51

+0

使用formset後,實體正在保存,但他們沒有得到相關的空間。 – 2011-05-27 09:39:05

回答

0

解決

有使用RAW形式的某種問題。我將EntityForm轉換爲ModelFormSet,然後實體得到保存。

修復了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) 
1

您不需要創建對象,ModelForm將爲您執行此操作,因此請刪除行space = Space()entity = Entity(),並且不要將任何instance傳遞給表單。

並且不重新創建all函數,它已經是Python built-in。 :-)

+0

感謝您的建議,但表單一直跟以前一樣:/ – 2011-05-27 08:16:45

+0

@Oscar Carballal會發生什麼?沒有entite保存在所有? – DrTyrsa 2011-05-27 08:26:32

+0

根本沒有。它節省了空間,但不是實體 – 2011-05-27 08:35:31