Django ModelForm - 使用外键创建实例
Django ModelForm - Create instance with foreign key
我想知道使用 Django 模型表单创建模型实例的正确方法是什么时候它包含所需的 FK?我认为这可能与 exclude
class 属性 有关,但在视图中我正在尝试在保存之前覆盖它。
型号:
class Profile(models.Model):
client = models.OneToOneField('auth.User')
first_name = models.TextField(blank=True,)
...
表格:
class ProfileForm(floppyforms.ModelForm):
class Meta:
exclude = ('client',)
model = Profile
widgets = {
'first_name': floppyforms.TextInput(attrs={'placeholder': 'First Name'}),
...
查看:
def post(self, request):
form = ProfileForm(request.POST)
if form.is_valid():
form.save(commit=False)
form.client = User.objects.create(username=request.POST['email'],)
form.save()
return redirect('/success')
return redirect('/error')
错误:
django.db.models.fields.related.RelatedObjectDoesNotExist: Profile has no client.
查看管理员,我可以看到用户已经创建。
干杯
您的 views.py 有误。应该是:
def post(self, request):
form = ProfileForm(request.POST)
if form.is_valid():
new_profile = form.save(commit=False)
new_profile.client = User.objects.create(username=request.POST['email'],)
new_profile.save()
return redirect('/success')
return redirect('/error')
您不应该将客户端分配给您的表单,而是分配给内存中的实例 new_profile
,然后调用 new_profile.save()
将 new_profile
保存到数据库。
我想知道使用 Django 模型表单创建模型实例的正确方法是什么时候它包含所需的 FK?我认为这可能与 exclude
class 属性 有关,但在视图中我正在尝试在保存之前覆盖它。
型号:
class Profile(models.Model):
client = models.OneToOneField('auth.User')
first_name = models.TextField(blank=True,)
...
表格:
class ProfileForm(floppyforms.ModelForm):
class Meta:
exclude = ('client',)
model = Profile
widgets = {
'first_name': floppyforms.TextInput(attrs={'placeholder': 'First Name'}),
...
查看:
def post(self, request):
form = ProfileForm(request.POST)
if form.is_valid():
form.save(commit=False)
form.client = User.objects.create(username=request.POST['email'],)
form.save()
return redirect('/success')
return redirect('/error')
错误:
django.db.models.fields.related.RelatedObjectDoesNotExist: Profile has no client.
查看管理员,我可以看到用户已经创建。
干杯
您的 views.py 有误。应该是:
def post(self, request):
form = ProfileForm(request.POST)
if form.is_valid():
new_profile = form.save(commit=False)
new_profile.client = User.objects.create(username=request.POST['email'],)
new_profile.save()
return redirect('/success')
return redirect('/error')
您不应该将客户端分配给您的表单,而是分配给内存中的实例 new_profile
,然后调用 new_profile.save()
将 new_profile
保存到数据库。