我有應用程序和角色的模型。角色與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
})
我的rolesFormSet沒有清除is_valid,我不知道爲什麼。似乎沒有填充任何字段,雖然當我在pdb中pring rolesFormSet.data時,我得到了'' –
thumbtackthief
我不確定它爲什麼沒有保存,而且它也混淆了爲什麼'應用程序'前綴的信息存在。 FWIW,打印POST請求給了我完全相同的輸出。 – thumbtackthief
您應該能夠通過在視圖中執行'print rolesFormset.errors'來了解爲什麼formset無效。 – Greg