gpt4 book ai didi

python - 在 Django 中,如何通过单个表单提交同时创建用户和用户配置文件

转载 作者:太空狗 更新时间:2023-10-30 02:13:35 25 4
gpt4 key购买 nike

我正在使用 UserCreationForm 的扩展版本通过我自己的模板添加用户,效果很好。

作为同一个表单模板的一部分,我还想包括来 self 的用户配置文件模型的自定义字段,这样当创建用户时,也会创建一个带有我的自定义字段的用户配置文件。

我的做法是使用两种表单,并将它们组合在一个模板中,并使用一个提交按钮。

表单完全按照我的要求显示,并正确返回验证错误,但可以预见的是,在保存到数据库时它会失败。当我在用户表单上调用 save() 时,用户被创建,但是当我尝试保存 userprofile 表单时,它当然会抛出错误,因为用户尚不存在,因此它没有用户关联。

虽然我认为我理解了我的问题的原因,但我不知道如何解决它,我什至不确定我所采取的方法是否正确。

我在下面包含了我的所有代码,包括模型以及表单和 View ,以防万一这有助于任何人更好地理解我正在尝试做的事情:

UserProfile 类 (models.py)

LEVEL = (
('admin', 'administrator'),
('team', 'team leader'),
('member', 'team member'),
)

class UserProfile(models.Model):
user = models.ForeignKey(User, unique=True)
level = models.CharField(choices=LEVEL, max_length=20)

UserCreationForm 和 UserProfileForm 类 (forms.py)

class UserCreationFormExtended(UserCreationForm): 
def __init__(self, *args, **kwargs):
super(UserCreationFormExtended, self).__init__(*args, **kwargs)
self.fields['first_name'].required = True
self.fields['last_name'].required = True

class Meta:
model = User
fields = ('username', 'email', 'first_name', 'last_name')


class UserProfileForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(UserProfileForm, self).__init__(*args, **kwargs)

self.fields["level"].choices = ( ('admin', 'administrator'), ('team', 'team leader'), ('member', 'team member') )

class Meta:
model = UserProfile

使用_添加 View (views.py)

def user_add(request):

if request.method == 'POST':
uform = UserCreationFormExtended(request.POST)
pform = UserProfileForm(request.POST)

if uform.is_valid():

uform.save()
pform.save()

return render_to_response('user/add_success.html', context_instance=RequestContext(request))

else:
return render_to_response('user/add.html', { 'uform' : uform, 'pform' : pform }, context_instance=RequestContext(request))

else:
uform = UserCreationFormExtended()
pform = UserProfileForm()

return render_to_response('user/add.html', { 'uform' : uform, 'pform' : pform }, context_instance=RequestContext(request))

最佳答案

首先,将 exclude = ('user',) 添加到 ProfileForm 的 Meta 类。那么,在你看来:

user_valid = uform.is_valid()
profile_valid = pform.is_valid()
if user_valid and profile_valid:
user = uform.save()
profile = pform.save(commit=False)
profile.user = user
profile.save()

尽管我想到因为个人资料表单上只有一个字段,但更简单的方法是完全忘记该表单,只需将字段添加到用户表单:

class UserCreationFormExtended(UserCreationForm): 
level = forms.ChoiceField(choices=LEVEL, max_length=20)
... etc...

if uform.is_valid():
user = uform.save()
profile = Profile.objects.create(user=user, level=uform.cleaned_data['level']))

关于python - 在 Django 中,如何通过单个表单提交同时创建用户和用户配置文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7584977/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com