【问题标题】:How can i combine two ModelForms in a single django views我如何在一个 django 视图中组合两个 ModelForm
【发布时间】:2019-11-14 14:19:38
【问题描述】:

大家好,所以我有两个模型,其中一个有一个指向另一个的外键字段,我有每个模型类的模型表单,在我的 views.py 中,我想用外键点制作模型在另一个模型上

我在 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 Constraint 错误。

【问题讨论】:

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


    【解决方案1】:

    您收到该错误,因为您确实没有player 的值设置为该对象的实例,因此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})

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

    <form method="post" action="{% url 'name-of-new-role-view' %}">
        {% csrf_token %}
        {{ rform }}
        {{ cform }}
        <input type="submit">
    </form>

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-19
      • 1970-01-01
      • 2021-04-10
      • 2018-11-01
      • 2015-11-05
      • 2012-05-23
      相关资源
      最近更新 更多