0

我有应用程序和角色的模型。角色链接到 FK Role_type,FK 链接到可以使用这些 Role_types 的应用程序(这对于问题来说有点过于简单,但我认为这就足够了)。我需要一种方法来创建一个表单来创建一个新的应用程序,还需要创建将相关角色分配给人员的记录(尽管它们可以留空。)

我已经为应用程序创建表单并在页面上显示相关的角色类型,并使用用户填充下拉列表。但是,点击提交并没有创建任何关联的角色记录。我所有的研究似乎都在不断地回到内联模型表单,但这些文档对我来说并没有什么意义——示例中的输入似乎与我的需要无关。

我知道这可能看起来像是重复的,但是当我说我已经查看了似乎与此相关的每个 SO 问题时,请相信我!

编辑:我的帖子看起来像这样: 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 给了我完全相同的输出(见下面的评论)

模型.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)

视图.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
         })
4

1 回答 1

1

没有更多信息很难说,但看起来你没有在视图中保存你的角色表单集。您需要在通话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 已经过时,并且 Role 实际上对 User 有一个 foreignKey,问题是你在这里设置了一个前缀:

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

但不在您的buildRolesFormset功能中。在该函数中,执行:

formset = RoleFormSet(prefix='roles')
于 2013-10-29T21:52:21.320 回答