我如何在一个django视图中结合两个ModelForms

时间:2019-07-03 20:54:40

标签: django django-models django-forms django-views

大家好,我有两个模型,其中一个模型有一个指向另一个模型的foreignkey字段,并且我有每个模型类的模型形式,在我的views.py中,我想用foreignkey指向模型在其他型号上

我在forms.py中创建了一个模型窗体(CharacterForm和RoleForm),该模型窗体将显示所有字段,但是在我的html中,我将隐藏播放器字段(指向另一个模型的外键),因此在我的views.py中会自动使新创建的角色成为玩家。

models.py

class Character(models.Model):
    #some fields

class Role(models.Model):
    player = models.ForeignKey(Character, on_delete=models.PROTECT, 
        related_name='the_player')

views.py

    def NewRole(request):
        if request.method == 'POST'
            form = CharacterForm()
            formset = RoleForm()
            if all([form.is_valid, formset.is_valid]):
                role_player = form.save()
                formset.player = role_player
                formset.save()
                return redirect('index')
        else:
            form = CharacterForm()
            formset = RoleForm()
            return render(request, 'new_role.html', {'form':form, 
                'formset':formset})

我只是想让角色模型下的玩家字段指向用户刚刚创建的角色模型,而我不知道做到这一点的最佳方法。我以为这样可以,但是我不断收到ForeignKey约束错误。

1 个答案:

答案 0 :(得分:1)

您收到该错误,因为您没有 not player的值设置为该对象的 instance ,因此将{{1 }}字段在创建对象时仍为player

您可以从None中排除它,例如:

RoleForm

接下来,在视图中,您将构造这两种形式,并将# app/forms.py from django import forms from app.models import Character, Role class CharacterForm(forms.ModelForm): class Meta: model = Character class RoleForm(forms.ModelForm): class Meta: model = Role exclude = ('player', )保存到正在构造的Character对象的实例后,可以将其链接起来,例如:

Role

在模板中,您可以简单地将其呈现为:

from app.forms import CharacterForm, RoleForm

def new_role(request):
    if request.method == 'POST'
        cform = CharacterForm(request.POST)
        rform = RoleForm(request.POST)
        if cform.is_valid() and rform.is_valid():
            character = cform.save()
            rform.instance.player = character
            rform.save()
            return redirect('index')
    else:
        rform = CharacterForm()
        cform = RoleForm()
    return render(request, 'new_role.html', {'rform': form, 'cform': cform})