如何允许使用UserChangeForm Django编辑扩展的UserProfile?

时间:2017-06-12 22:12:18

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

所有这一切的拳头是我在这里的第一个实际帖子,所​​以请保持温和。

我已经和Django一起工作了几个星期,并通过在Google和Google上搜索来克服大部分麻烦,但是在尝试允许用户编辑他们的个人资料时我似乎陷入了困境。特别允许用户编辑我扩展到普通Django用户的字段。

我能够允许用户查看和更新​​常规Django用户中包含的所有信息,但是当表单显示" company_name"字段,它不会自动填充当前值,如果用户键入其他公司,则不会保存。

Forms.py

class EditUserProfileForm(UserChangeForm):
class Meta:
    model = UserProfile
    fields= ('company_name','password',)

class EditUserForm(UserChangeForm):
    class Meta:
        model = User
        fields = ('first_name', 'last_name', 'email', 'password')

Views.py

def edit_profile(request):
content = {}
profile = request.user.get_username()
if request.method == 'POST':
    form = EditUserProfileForm (request.POST, instance=request.user)
    form2 = EditUserForm (request.POST, instance=request.user)
    content['form'] = form
    content['form2'] = form2

    if form.is_valid() and form2.is_valid():
        new_user = form.save()
        new_user2 = form2.save()
        return render(request, 'website/view_profile.html', content)

    else:
        content['form.errors'] = form.errors
        content['form2.errors'] = form2.errors
else:
    form = EditUserProfileForm(instance=request.user)
    form2 = EditUserForm(instance=request.user)
    content['form']= form
    content['form2'] = form2
return render(request, 'website/edit_profile.html', content)

Models.py (不确定是否有必要)

class UserProfile(models.Model):
user = models.OneToOneField(User)

verified_email = models.BooleanField(blank=True, default = False)
company_name = models.CharField(max_length=100, blank=False)

def __unicode__(self):
    return self.user.username

如果有任何其他可能需要的代码段来帮助我,请告诉我。

谢谢!

1 个答案:

答案 0 :(得分:1)

因此,对于遇到此问题的其他人,我找到了解决方案。

在我的views.py中,我不得不改变这个:

form = EditUserProfileForm(instance=request.user)

到此:

form = EditUserProfileForm(instance=request.user.userprofile)

这最终使我能够查看我的扩展UserProfile信息。但是忽略了改变它我不得不覆盖UserChangeForm的clean_password方法,最终刚刚从UserChangeForm中删除了我需要的东西并最终得到了这个:

<强> Forms.py

class EditUserProfileForm(forms.ModelForm):
"""
This class is a carbon copy of the UserChangeForm class from
django.contrib.auth.forms, with the password functionality deleted, and
the form is modified to allow changes to be made to the
UserProfle, which extends the Django User
"""
class Meta:
    model = UserProfile
    fields = ('company_name',)

def __init__(self, *args, **kwargs):
    super(EditUserProfileForm, self).__init__(*args, **kwargs)
    f = self.fields.get('user_permissions', None)
    if f is not None:
        f.queryset = f.queryset.select_related('content_type')

class EditUserForm(forms.ModelForm):
    class Meta:
        model = User
        fields = ('first_name', 'last_name', 'email')

    def __init__(self, *args, **kwargs):
        super(EditUserForm, self).__init__(*args, **kwargs)
        f = self.fields.get('user_permissions', None)
        if f is not None:
            f.queryset = f.queryset.select_related('content_type')