2013-10-29 42 views
0

我有應用程序和角色的模型。角色與FK Role_type相關聯,FK Role_type通過FK鏈接到可以使用這些Role_types的應用程序(這對於該問題有點過分簡單,但我認爲它足夠)。我需要一種方法來創建一個表單來創建一個新的應用程序,並創建記錄分配給人們相關的角色(儘管它們可以留空)。多個鏈接的Django表單,一個提交

我已經得到了儘可能爲應用程序創建窗體具有關聯的角色類型出現在頁面上,並且可以使用用戶填充下拉列表。但是,提交卻沒有創建任何關聯的角色記錄。我所有的研究似乎都繼續回到Inline Model Forms,但是這些文檔對我來說並沒有什麼意義 - 這個例子中的輸入似乎與我所需要的不相關。

我知道這看起來像是重複的,但是當我說我已經看過每個似乎與此相關的SO問題時,請相信我!

編輯:我的POST看起來像這樣:QueryDict: {u'roles-MAX_NUM_FORMS': [u'1000'], u'roles-1-role_type': [u'4'], u'roles-0-user': [u'1'], u'app-owner': [u'1'], u'app-name': [u'1234'], u'app-serviceTier': [u''], u'app-jiraProject': [u''], u'roles-TOTAL_FORMS': [u'2'], u'roles-1-user': [u''], u'roles-0-role_type': [u'3'], u'csrfmiddlewaretoken': [u'eGsDwtsSQJfl0'], u'roles-INITIAL_FORMS': [u'2']}>。印刷RolesFormSet給我完全相同的輸出(見下面的評論)

models.py

class Item(models.model): 
    name = models.CharField(max_length=255) 
    roles = models.ManyToManyField(User, through='Role') 

class Application(Item): 
    other_assorted_attributes = foo 

class RoleType(models.Model): 
    name = models.CharField(max_length=255) 

class ItemTypeRoleMapping(models.Model): 
''' pairs role-types (e.g., Developer) with an Item class they are relevant to''' 
    roleType = models.ForeignKey(RoleType) 
    itemType = models.CharField(max_length=255, choices=itemChoices)   

class Role(models.Model): 
    role_type = models.ForeignKey(RoleType) 
    user  = models.ForeignKey(User) 
    item  = models.ForeignKey(Item) 

views.py

def buildRolesFormset(itemClass): 
    ''' given an item, build a form for all associated roles ''' 
    roleTypesForItem = ItemTypeRoleMapping.objects.all().filter(itemType=itemClass.__name__) 
    applicable_roles = [{'role_type': roleType} for roleType in roleTypesForItem] 
    # formset = rolesFormSet(initial=initial, prefix='roles') 
    RoleFormSet = inlineformset_factory(Application, Role, extra=len(roleTypesForItem), can_delete=False) 
    formset = RoleFormSet() 
    for subform, data in zip(formset.forms, applicable_roles): 
     subform.initial = data 
    return formset 

def new(request): 
    ''' Create a new application ''' 
    user = request.user 
    # check permission 

    if request.method == 'POST': 
     appform = AppForm(request.POST, prefix='app') 

     if appform.is_valid(): 
      app = appform.save(commit=False) 
      rolesInlineFormSet = inlineformset_factory(Application, Role) 
      # pdb.set_trace() 
      rolesFormSet = rolesInlineFormSet(request.POST, instance=app, prefix='roles') 
      if rolesFormSet.is_valid(): 
       rolesFormSet.save() 
      else: 
       print rolesFormSet.errors 
      app = appform.save() 
      # check rolesFormSet 

      return redirect(reverse('index')) 
    else: 
     appform = AppForm(prefix='app') 
     rolesFormSet = buildRolesFormset(Application) 

    return render(request, 'who/editapp.html', 
     {'appform': appform, 
     'rolesFormSet': rolesFormSet 
     }) 

回答

1

整蠱告訴沒有更多的信息,但它看起來像你」不要在視圖中保存您的rolesFormset。您需要撥打rolesFormset.save()以及您的form.save()電話。另外,我想你想將角色附加到創建的應用程序?像這樣的事情在你看來應該工作:

if request.method == 'POST': 
    form = AppForm(request.POST) 
    rolesFormset = RoleForm(request.POST) 
    if form.is_valid() and rolesFormset.is_valid(): 
     app = form.save() 
     roles = rolesFormset.save() 
     for role in roles: 
      app.roles.add(role) 
     return redirect(reverse('index')) 

更新:。假定的models.py是外的日期和角色事實上確實有一個ForeignKey到用戶,這個問題將是您」再坐在這裏的前綴:在你buildRolesFormset功能

rolesFormSet = rolesInlineFormSet(request.POST, instance=app, prefix='roles') 

但不是。在這個功能,做:

formset = RoleFormSet(prefix='roles') 
+0

我的rolesFormSet沒有清除is_valid,我不知道爲什麼。似乎沒有填充任何字段,雖然當我在pdb中pring rolesFormSet.data時,我得到了'' – thumbtackthief

+0

我不確定它爲什麼沒有保存,而且它也混淆了爲什麼'應用程序'前綴的信息存在。 FWIW,打印POST請求給了我完全相同的輸出。 – thumbtackthief

+0

您應該能夠通過在視圖中執行'print rolesFormset.errors'來了解爲什麼formset無效。 – Greg