大家好,我有两个模型,其中一个模型有一个指向另一个模型的foreignkey字段,并且我有每个模型类的模型形式,在我的views.py中,我想用foreignkey指向模型在其他型号上
我在forms.py中创建了一个模型窗体(CharacterForm和RoleForm),该模型窗体将显示所有字段,但是在我的html中,我将隐藏播放器字段(指向另一个模型的外键),因此在我的views.py中会自动使新创建的角色成为玩家。
class Character(models.Model):
#some fields
class Role(models.Model):
player = models.ForeignKey(Character, on_delete=models.PROTECT,
related_name='the_player')
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约束错误。
答案 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})