ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2019-06-13 22:43:14  阅读:145  来源: 互联网

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


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

作为同一表单模板的一部分,我还希望包含来自userprofile模型的自定义字段,以便在创建用户时还可以创建具有自定义字段的用户配置文件.

我的方法是使用两个表单,并将它们组合在一个模板中,并带有一个提交按钮.

表单完全按照我的意愿显示,并正确返回验证错误,但可以预见,它在保存到数据库时会出现问题.当我在用户表单上调用save()创建用户时,当然当我尝试保存userprofile表单时,它会抛出一个错误,因为用户尚不存在,所以它没有用户关联它.

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

我已经在下面包含了我的所有代码,包括模型以及表单和视图,以防万一这有助于任何人更好地理解我想要做的事情:

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

use_add视图(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,django-models,django-views,django-forms
来源: https://codeday.me/bug/20190613/1235738.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有