Django 保存扩展用户模型的问题

Django 保存扩展用户模型的问题,django,django-forms,django-views,Django,Django Forms,Django Views,我在提交一个表单时遇到了问题,该表单创建了一个从auth.user扩展而来的用户配置文件,该用户已经在Django Register注册 我收到错误:请更正以下字段:来自我模板中的一个代码字符串: {% if form.errors %}<p>Please correct the following fields:</p>{% endif %} 我的表格.py class RegistrationForm(ModelForm): # Basic Informatio

我在提交一个表单时遇到了问题,该表单创建了一个从auth.user扩展而来的用户配置文件,该用户已经在Django Register注册

我收到错误:
请更正以下字段:
来自我模板中的一个代码字符串:

{% if form.errors %}<p>Please correct the following fields:</p>{% endif %} 
我的表格.py

class RegistrationForm(ModelForm):

# Basic Information
first_name = forms.RegexField(label='First Name', regex=r'^[A-Z][a-zA-Z\s]+$',
             error_messages = {'invalid': "A name starts with a capital letter,
                     and may contain only alphabetical characters."})
last_name = forms.RegexField(label='Last Name', regex=r'^[A-Z][a-zA-Z\s]+$',
        error_messages = {'invalid': "A name starts with a capital letter,
                    and may contain only alphabetical characters."} )

# Details
au_status = forms.TypedChoiceField(label='Are you a member of the AU?', required=False, choices=choices, coerce=int)

# Next of Kin Details
nok_first_name = forms.RegexField(label='First Name (Next of Kin)', regex=r'^[A-Z][a-zA-Z\s]+$',
              error_messages = {'invalid': "A name starts with a capital letter, 
                          and may contain only alphabetical characters."})
nok_last_name = forms.RegexField(label='Last Name (Next of Kin)',
                         regex=r'^[A-Z][a-zA-Z\s]+$',
                 error_messages = {'invalid': "A name starts with a capital
                         letter, and may contain only alphabetical characters."})

# Health and Safety
swim = forms.TypedChoiceField(label='Can you swim more than 100m?',
               required=False, choices=choices, coerce=int)

# Equipment:
sleeping_bag = forms.TypedChoiceField(label='Do you have a warm sleeping bag', required=False, choices=choices, coerce=int)
waterproof = forms.TypedChoiceField(label='Do you have waterproof clothing?', required=False, choices=choices, coerce=int)
shoes = forms.TypedChoiceField(label='Do you have a pair of climbing shoes?', required=False, choices=choices, coerce=int)
harness = forms.TypedChoiceField(label='Do you have a harness?', required=False, choices=choices, coerce=int)
belay_device = forms.TypedChoiceField(label='Do you have a belay plate and a screwgate?', required=False, choices=choices, coerce=int)
helmet = forms.TypedChoiceField(label='Do you have a helmet?', required=False, choices=choices, coerce=int)
nut = forms.TypedChoiceField(label='Do you have a set of nuts?', required=False, choices=choices, coerce=int)
hex = forms.TypedChoiceField(label='Do you have a set of hexes?', required=False, choices=choices, coerce=int)

# Misc.:
minibus = forms.TypedChoiceField(label='Can you drive the SU minibus?', required=False, choices=choices, coerce=int)

class Meta:
    model = UserProfile
我的观点

def MemberRegistration(request):
if not request.user.is_authenticated():
    return HttpResponseRedirect('/accounts/login/')
if request.method == 'POST':
    form = RegistrationForm(request.POST)
    if form.is_valid():
        user = User.objects.get(username=request.user)
        profile = UserProfile(user=user)  
        profile.first_name      = form.cleaned_data['first_name']
        profile.last_name       = form.cleaned_data['last_name']
        profile.dob             = form.cleaned_data['dob']
        profile.stud_id         = form.cleaned_data['stud_id']
        profile.mob_num         = form.cleaned_data['mob_num']
        profile.home_num        = form.cleaned_data['home_num']
        profile.term_add        = form.cleaned_data['term_add']
        profile.perm_add        = form.cleaned_data['perm_add']
        profile.au_status       = form.cleaned_data['au_status']
        profile.nok_first_name  = form.cleaned_data['nok_first_name']
        profile.nok_last_name   = form.cleaned_data['nok_last_name']
        profile.relationship    = form.clenaed_data['relationship']
        profile.nok_mob_num     = form.cleaned_data['nok_mob_num']
        profile.nok_home_num    = form.cleaned_data['nok_home_num']
        profile.nok_add         = form.cleaned_data['nok_add']
        profile.diet            = form.cleaned_data['diet']
        profile.med_cond        = form.cleaned_data['med_cond']
        profile.fear            = form.cleaned_data['fear']
        profile.swim            = form.cleaned_data['swim']
        profile.sleeping_bag    = form.cleaned_data['sleeping_bag']
        profile.waterproof      = form.cleaned_data['waterproof']
        profile.shoes           = form.cleaned_data['shoes']
        profile.shoe_size       = form.cleaned_data['shoe_size']
        profile.harness         = form.cleaned_data['harness']
        profile.belay_device    = form.cleaned_data['belay_device']
        profile.helmet          = form.cleaned_data['helmet']
        profile.nut             = form.cleaned_data['nut']
        profile.hex             = form.cleaned_data['hex']
        profile.minibus         = form.cleaned_data['minibus']  
        profile.save()
        return render_to_response('base_profile.html', context_instance=RequestContext(request))
    else:
        return render_to_response('base_registration.html', {'form': form}, context_instance=RequestContext(request))
else:
    form = RegistrationForm()
    context = {'form': form}
    return render_to_response('base_registration.html', context, context_instance=RequestContext(request))`
`if form.is_valid():
        user = User.objects.get(username=request.user)
            user.first_name     = form.cleaned_data['first_name']
            user.last_name      = form.cleaned_data['last_name']
            user.save()
            profile = UserProfile(user=user,
            dob             = form.cleaned_data['dob'],
            stud_id         = form.cleaned_data['stud_id'],
            mob_num         = form.cleaned_data['mob_num'],
            home_num        = form.cleaned_data['home_num'],
            term_add        = form.cleaned_data['term_add'],
            perm_add        = form.cleaned_data['perm_add'],
            au_status       = form.cleaned_data['au_status'],
            nok_first_name  = form.cleaned_data['nok_first_name'],
            nok_last_name   = form.cleaned_data['nok_last_name'],
            relationship    = form.cleaned_data['relationship'],
            nok_mob_num     = form.cleaned_data['nok_mob_num'],
            nok_home_num    = form.cleaned_data['nok_home_num'],
            nok_add     = form.cleaned_data['nok_add'],
            diet            = form.cleaned_data['diet'],
            med_cond        = form.cleaned_data['med_cond'],
            fear            = form.cleaned_data['fear'],
            swim            = form.cleaned_data['swim'],
            sleeping_bag    = form.cleaned_data['sleeping_bag'],
            waterproof      = form.cleaned_data['waterproof'],
            shoes           = form.cleaned_data['shoes'],
            shoe_size       = form.cleaned_data['shoe_size'],
            harness         = form.cleaned_data['harness'],
            belay_device    = form.cleaned_data['belay_device'],
            helmet          = form.cleaned_data['helmet'],
            nut             = form.cleaned_data['nut'],
            hex             = form.cleaned_data['hex'],
            minibus         = form.cleaned_data['minibus'],
            )
           profile.save()` 
非常感谢您的帮助!如果有人能告诉我如何减少代码,我会觉得这太过分了。谢谢你的帮助:)

更新:

我知道是什么错误!我没有填写模型的用户字段。有谁能帮我减少代码的使用量吗

更新2:

表单现在已通过,但始终存在错误

使用此版本的my views.py时,我在/register/-accounts\u userprofile.first\u name处获取行
profile.save()
IntegrityError

def MemberRegistration(request):
if not request.user.is_authenticated():
    return HttpResponseRedirect('/accounts/login/')
if request.method == 'POST':
    form = RegistrationForm(request.POST)
    if form.is_valid():
        user = User.objects.get(username=request.user)
        profile = UserProfile(user=user)  
        profile.first_name      = form.cleaned_data['first_name']
        profile.last_name       = form.cleaned_data['last_name']
        profile.dob             = form.cleaned_data['dob']
        profile.stud_id         = form.cleaned_data['stud_id']
        profile.mob_num         = form.cleaned_data['mob_num']
        profile.home_num        = form.cleaned_data['home_num']
        profile.term_add        = form.cleaned_data['term_add']
        profile.perm_add        = form.cleaned_data['perm_add']
        profile.au_status       = form.cleaned_data['au_status']
        profile.nok_first_name  = form.cleaned_data['nok_first_name']
        profile.nok_last_name   = form.cleaned_data['nok_last_name']
        profile.relationship    = form.clenaed_data['relationship']
        profile.nok_mob_num     = form.cleaned_data['nok_mob_num']
        profile.nok_home_num    = form.cleaned_data['nok_home_num']
        profile.nok_add         = form.cleaned_data['nok_add']
        profile.diet            = form.cleaned_data['diet']
        profile.med_cond        = form.cleaned_data['med_cond']
        profile.fear            = form.cleaned_data['fear']
        profile.swim            = form.cleaned_data['swim']
        profile.sleeping_bag    = form.cleaned_data['sleeping_bag']
        profile.waterproof      = form.cleaned_data['waterproof']
        profile.shoes           = form.cleaned_data['shoes']
        profile.shoe_size       = form.cleaned_data['shoe_size']
        profile.harness         = form.cleaned_data['harness']
        profile.belay_device    = form.cleaned_data['belay_device']
        profile.helmet          = form.cleaned_data['helmet']
        profile.nut             = form.cleaned_data['nut']
        profile.hex             = form.cleaned_data['hex']
        profile.minibus         = form.cleaned_data['minibus']  
        profile.save()
        return render_to_response('base_profile.html', context_instance=RequestContext(request))
    else:
        return render_to_response('base_registration.html', {'form': form}, context_instance=RequestContext(request))
else:
    form = RegistrationForm()
    context = {'form': form}
    return render_to_response('base_registration.html', context, context_instance=RequestContext(request))`
`if form.is_valid():
        user = User.objects.get(username=request.user)
            user.first_name     = form.cleaned_data['first_name']
            user.last_name      = form.cleaned_data['last_name']
            user.save()
            profile = UserProfile(user=user,
            dob             = form.cleaned_data['dob'],
            stud_id         = form.cleaned_data['stud_id'],
            mob_num         = form.cleaned_data['mob_num'],
            home_num        = form.cleaned_data['home_num'],
            term_add        = form.cleaned_data['term_add'],
            perm_add        = form.cleaned_data['perm_add'],
            au_status       = form.cleaned_data['au_status'],
            nok_first_name  = form.cleaned_data['nok_first_name'],
            nok_last_name   = form.cleaned_data['nok_last_name'],
            relationship    = form.cleaned_data['relationship'],
            nok_mob_num     = form.cleaned_data['nok_mob_num'],
            nok_home_num    = form.cleaned_data['nok_home_num'],
            nok_add     = form.cleaned_data['nok_add'],
            diet            = form.cleaned_data['diet'],
            med_cond        = form.cleaned_data['med_cond'],
            fear            = form.cleaned_data['fear'],
            swim            = form.cleaned_data['swim'],
            sleeping_bag    = form.cleaned_data['sleeping_bag'],
            waterproof      = form.cleaned_data['waterproof'],
            shoes           = form.cleaned_data['shoes'],
            shoe_size       = form.cleaned_data['shoe_size'],
            harness         = form.cleaned_data['harness'],
            belay_device    = form.cleaned_data['belay_device'],
            helmet          = form.cleaned_data['helmet'],
            nut             = form.cleaned_data['nut'],
            hex             = form.cleaned_data['hex'],
            minibus         = form.cleaned_data['minibus'],
            )
           profile.save()` 
如果改用此版本的views.py:

if form.is_valid():
        profile = User.objects.get(username=request.user)

        for key in UserProfileForm.base_fields.keys():
            for val in form.cleaned_data.values():
                setattr(profile, key, val)

        profile.save()

        return render_to_response('base_profile.html', context_instance=RequestContext(request))`

我被传递到base_profile.html,其中只有名字和姓氏被填充为“添加/烫发添加/不添加/节食/中等/恐惧”字段。有人能帮忙吗?很抱歉成为这样一个noob>对于视图,您可以通过以下方式减少它:

<div class='register_div'>
  {% if form.first_name.errors %}
    <p class='error'>{{ form.first_name.errors }}</p>
  {% endif %}
  <p>
    <label for='first_name'{% if form.first_name.errors %}class='error'{% endif %}>
      First Name:
    </label>
  </p>
  <p>{{ form.first_name }}</p>
</div>
def MemberRegistration(request):
if request.user.is_authenticated():
    return render_to_response('base_profile.html', context_instance=RequestContext(request))
if request.method == 'POST':
    form = RegistrationForm(request.POST)
    if form.is_valid():
        user = User.objects.create_user(username        = form.cleaned_data['username'],    
                                        email           = form.cleaned_data['email'],
                                        password        = form.cleaned_data['password'],
                                        )
        user.first_name = form.cleaned_data['first_name']
        user.last_name  = form.cleaned_data['last_name']
        member = user.save()
        member = Member(user=user,  first_name      = form.cleaned_data['first_name'],
                                    last_name       = form.cleaned_data['last_name'],
                                    date_of_birth   = form.cleaned_data['date_of_birth'],
                                    email           = form.cleaned_data['email'],
                                    student_id      = form.cleaned_data['student_id'],
                                    au_status       = form.cleaned_data['au_status'],
                                    mob_num         = form.cleaned_data['mob_num'],
                                    home_num        = form.cleaned_data['home_num'],
                                    term_time_add   = form.cleaned_data['term_time_add'],
                                    permanent_add   = form.cleaned_data['permanent_add'],
                                    diet            = form.cleaned_data['diet'],
                                    med_condition   = form.cleaned_data['med_condition'],
                                    fear            = form.cleaned_data['fear'],
                                    swim            = form.cleaned_data['swim'],
                                    sleeping_bag    = form.cleaned_data['sleeping_bag'],
                                    waterproof      = form.cleaned_data['waterproof'],
                                    shoes           = form.cleaned_data['shoes'],
                                    shoe_size       = form.cleaned_data['shoe_size'],
                                    harness         = form.cleaned_data['harness'],
                                    belay_device    = form.cleaned_data['belay_device'],
                                    helmet          = form.cleaned_data['helmet'],
                                    nuts_set        = form.cleaned_data['nuts_set'],
                                    hexes_set       = form.cleaned_data['hexes_set'],
                                    minibus_driver  = form.cleaned_data['minibus_driver'],
                                    )

        member.save()
        return render_to_response('base_profile.html', context_instance=RequestContext(request))
    else:
        return render_to_response('base_registration.html', {'form': form}, context_instance=RequestContext(request))
else:
    form = RegistrationForm()
    context = {'form': form}
    return render_to_response('base_registration.html', context, context_instance=RequestContext(request))
if form.is_valid():
    profile = UserProfile(user=request.user)  # you already have the user in the request.

    for key, val in form.cleaned_data.values():
        setattr(profile, key, val)

    profile.save()
class UserDetails(models.Model):
    user = models.ForeignKey(User)        

    name = models.CharField(max_length=255)
    value = models.CharField(max_length=255)
for key, value in form.cleaned_data.values():
    UserDetails(user=request.user, name=key, value=value).save()
在这里,您将迭代字典并将所有键和值设置为profile对象。请检查是否需要所有密钥,如果不需要,您将不得不以某种方式删除它们或尝试其他方法,例如:

my_keys = ('key1', 'key2', 'key3', ...)
for key in my_keys:
    profile[key] = form.cleaned_data.get(key, "")

profile.save()
此外,还应使用模型表格:

class RegistrationForm(forms.ModelForm):
    class Meta:
        model = UserProfile
        exclude = ('user',)
另外,django的用户模型已经有了名字和姓氏字段,因此您无需再次添加这些字段

我可以看到您的模型上也有很多字段,我建议您创建如下模型:

<div class='register_div'>
  {% if form.first_name.errors %}
    <p class='error'>{{ form.first_name.errors }}</p>
  {% endif %}
  <p>
    <label for='first_name'{% if form.first_name.errors %}class='error'{% endif %}>
      First Name:
    </label>
  </p>
  <p>{{ form.first_name }}</p>
</div>
def MemberRegistration(request):
if request.user.is_authenticated():
    return render_to_response('base_profile.html', context_instance=RequestContext(request))
if request.method == 'POST':
    form = RegistrationForm(request.POST)
    if form.is_valid():
        user = User.objects.create_user(username        = form.cleaned_data['username'],    
                                        email           = form.cleaned_data['email'],
                                        password        = form.cleaned_data['password'],
                                        )
        user.first_name = form.cleaned_data['first_name']
        user.last_name  = form.cleaned_data['last_name']
        member = user.save()
        member = Member(user=user,  first_name      = form.cleaned_data['first_name'],
                                    last_name       = form.cleaned_data['last_name'],
                                    date_of_birth   = form.cleaned_data['date_of_birth'],
                                    email           = form.cleaned_data['email'],
                                    student_id      = form.cleaned_data['student_id'],
                                    au_status       = form.cleaned_data['au_status'],
                                    mob_num         = form.cleaned_data['mob_num'],
                                    home_num        = form.cleaned_data['home_num'],
                                    term_time_add   = form.cleaned_data['term_time_add'],
                                    permanent_add   = form.cleaned_data['permanent_add'],
                                    diet            = form.cleaned_data['diet'],
                                    med_condition   = form.cleaned_data['med_condition'],
                                    fear            = form.cleaned_data['fear'],
                                    swim            = form.cleaned_data['swim'],
                                    sleeping_bag    = form.cleaned_data['sleeping_bag'],
                                    waterproof      = form.cleaned_data['waterproof'],
                                    shoes           = form.cleaned_data['shoes'],
                                    shoe_size       = form.cleaned_data['shoe_size'],
                                    harness         = form.cleaned_data['harness'],
                                    belay_device    = form.cleaned_data['belay_device'],
                                    helmet          = form.cleaned_data['helmet'],
                                    nuts_set        = form.cleaned_data['nuts_set'],
                                    hexes_set       = form.cleaned_data['hexes_set'],
                                    minibus_driver  = form.cleaned_data['minibus_driver'],
                                    )

        member.save()
        return render_to_response('base_profile.html', context_instance=RequestContext(request))
    else:
        return render_to_response('base_registration.html', {'form': form}, context_instance=RequestContext(request))
else:
    form = RegistrationForm()
    context = {'form': form}
    return render_to_response('base_registration.html', context, context_instance=RequestContext(request))
if form.is_valid():
    profile = UserProfile(user=request.user)  # you already have the user in the request.

    for key, val in form.cleaned_data.values():
        setattr(profile, key, val)

    profile.save()
class UserDetails(models.Model):
    user = models.ForeignKey(User)        

    name = models.CharField(max_length=255)
    value = models.CharField(max_length=255)
for key, value in form.cleaned_data.values():
    UserDetails(user=request.user, name=key, value=value).save()
通过这种方式,您可以以更灵活的方式保存所有详细信息,而无需为用户保存大量字段。您可以让它变得更加有趣,并添加一个类型和一个函数来转换它(例如,如果您需要将值设置为整数)

因此,例如,您不必像
home\u num
diet
那样向
UserProfile
类添加字段,而可以执行以下操作:

<div class='register_div'>
  {% if form.first_name.errors %}
    <p class='error'>{{ form.first_name.errors }}</p>
  {% endif %}
  <p>
    <label for='first_name'{% if form.first_name.errors %}class='error'{% endif %}>
      First Name:
    </label>
  </p>
  <p>{{ form.first_name }}</p>
</div>
def MemberRegistration(request):
if request.user.is_authenticated():
    return render_to_response('base_profile.html', context_instance=RequestContext(request))
if request.method == 'POST':
    form = RegistrationForm(request.POST)
    if form.is_valid():
        user = User.objects.create_user(username        = form.cleaned_data['username'],    
                                        email           = form.cleaned_data['email'],
                                        password        = form.cleaned_data['password'],
                                        )
        user.first_name = form.cleaned_data['first_name']
        user.last_name  = form.cleaned_data['last_name']
        member = user.save()
        member = Member(user=user,  first_name      = form.cleaned_data['first_name'],
                                    last_name       = form.cleaned_data['last_name'],
                                    date_of_birth   = form.cleaned_data['date_of_birth'],
                                    email           = form.cleaned_data['email'],
                                    student_id      = form.cleaned_data['student_id'],
                                    au_status       = form.cleaned_data['au_status'],
                                    mob_num         = form.cleaned_data['mob_num'],
                                    home_num        = form.cleaned_data['home_num'],
                                    term_time_add   = form.cleaned_data['term_time_add'],
                                    permanent_add   = form.cleaned_data['permanent_add'],
                                    diet            = form.cleaned_data['diet'],
                                    med_condition   = form.cleaned_data['med_condition'],
                                    fear            = form.cleaned_data['fear'],
                                    swim            = form.cleaned_data['swim'],
                                    sleeping_bag    = form.cleaned_data['sleeping_bag'],
                                    waterproof      = form.cleaned_data['waterproof'],
                                    shoes           = form.cleaned_data['shoes'],
                                    shoe_size       = form.cleaned_data['shoe_size'],
                                    harness         = form.cleaned_data['harness'],
                                    belay_device    = form.cleaned_data['belay_device'],
                                    helmet          = form.cleaned_data['helmet'],
                                    nuts_set        = form.cleaned_data['nuts_set'],
                                    hexes_set       = form.cleaned_data['hexes_set'],
                                    minibus_driver  = form.cleaned_data['minibus_driver'],
                                    )

        member.save()
        return render_to_response('base_profile.html', context_instance=RequestContext(request))
    else:
        return render_to_response('base_registration.html', {'form': form}, context_instance=RequestContext(request))
else:
    form = RegistrationForm()
    context = {'form': form}
    return render_to_response('base_registration.html', context, context_instance=RequestContext(request))
if form.is_valid():
    profile = UserProfile(user=request.user)  # you already have the user in the request.

    for key, val in form.cleaned_data.values():
        setattr(profile, key, val)

    profile.save()
class UserDetails(models.Model):
    user = models.ForeignKey(User)        

    name = models.CharField(max_length=255)
    value = models.CharField(max_length=255)
for key, value in form.cleaned_data.values():
    UserDetails(user=request.user, name=key, value=value).save()
然后只需访问任何:

print request.user.user_details_set.all()

它应该打印所有这些细节。从这种方法中我能看到的唯一一件坏事是,
ModelForms
不会那么容易工作,但我向您保证迁移会更加零星:)

您已经在“request.user”中找到了用户,为什么要再查一次?问题是我之前已经创建了这个用户,我不应该让他/她再输入用户名等。有什么解决方法吗?好的,刚刚更新了答案,问题是你正在做一个错误的查询,以获得用户@möter saidDo我仍然必须将用户字段添加到表单中?我仍然得到相同的错误,即用户字段是必需的>。哦,你应该在那里使用模型表单,你需要从元中排除该字段。只是更新一下