django - 如何在单个 django 视图中组合两个 ModelForm
问题描述
大家好,所以我有两个模型,其中一个有一个指向另一个的外键字段,我有每个模型类的模型表单,在我的views.py中,我想用另一个外键点制作模型模型
我在 forms.py 中创建了一个模型表单(CharacterForm 和 RoleForm),它会显示所有字段,但在我的 html 中,我会隐藏玩家字段(指向另一个模型的外键)所以在我的 views.py 中我会自动制作新创建的角色玩家。
模型.py
class Character(models.Model):
#some fields
class Role(models.Model):
player = models.ForeignKey(Character, on_delete=models.PROTECT,
related_name='the_player')
视图.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 错误。
解决方案
您收到该错误,因为您没有将的值设置为该对象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>
推荐阅读
- javascript - 未捕获的无效图像,图像字典应包含 dataURL 条目(或 node.js 中的本地文件路径)
- android - 我在 onPostExecute 中更新我的 textView 时遇到问题
- javascript - Semantic-ui 反应模态速记防止按钮关闭模态
- bluetooth-lowenergy - 使用 CoreLocation 时 NFC 被阻止
- c# - 在 AWS 上处理控制台应用程序的关闭
- pandas - pd.read_hdf 文件名或路径包含中文时出错
- android - 如何将 android 设备作为从设备并从 iot 硬件如 Electric Imp、Arduiono 甚至 PC 读取从设备数据?
- microsoft-cognitive - 语音门户不显示日志列表
- c# - 如何从 EntityFramework 6 中 EntityType 的反向导航属性中过滤“简单”导航属性?
- javascript - 如何确定打字稿、数字数组或字符串数组中的变量类型?