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

Python 如何允许使用UserChangeForm Django编辑扩展的UserProfile?,python,django,django-forms,django-views,django-registration,Python,Django,Django Forms,Django Views,Django Registration,首先,这是我在这里的第一篇文章,所以请温柔一点 我已经和Django一起工作了几个星期了,通过在这里和谷歌上搜索,我克服了大多数困难,但是当我试图允许用户编辑他们的个人资料时,我似乎被卡住了。特别是允许用户编辑我扩展到普通Django用户的字段 我可以允许用户查看和更新普通Django用户中包含的所有信息,但是当表单显示“company_name”字段时,它不会自动填充当前值,如果用户在中键入其他公司,它也不会保存 Forms.py class EditUserProfileForm(UserC

首先,这是我在这里的第一篇文章,所以请温柔一点

我已经和Django一起工作了几个星期了,通过在这里和谷歌上搜索,我克服了大多数困难,但是当我试图允许用户编辑他们的个人资料时,我似乎被卡住了。特别是允许用户编辑我扩展到普通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')
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)
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')
视图.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')
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)
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')
Models.py(不确定是否有必要)

如果需要任何其他代码片段来帮助我,请告诉我


谢谢

所以对于其他遇到这个问题的人,我找到了解决办法

在my views.py中,我必须更改以下内容:

form = EditUserProfileForm(instance=request.user)
为此:

form = EditUserProfileForm(instance=request.user.userprofile)
这最终使我能够查看扩展的用户配置文件信息。然而,不管如何更改,我不得不覆盖UserChangeForm的clean_password方法,并最终从UserChangeForm中删除了我需要的内容,最终得到以下结果:

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')
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)
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')

我的form2没有值,你是如何在form2上显示值的?@Sarotobi你说form2是指什么?第一个表单有值,但第二个表单没有显示任何值