【问题标题】:How do I allow the editing of my extended UserProfile with UserChangeForm Django?如何允许使用 UserChangeForm Django 编辑我的扩展 UserProfile?
【发布时间】:2017-11-14 12:34:03
【问题描述】:

这是我在这里的第一个实际帖子,所​​以请温柔。

我已经使用 Django 工作了几个星期,并且通过在此处和 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

如果可能需要任何其他代码 sn-ps 来帮助我,请告诉我。

谢谢!

【问题讨论】:

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


    【解决方案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')
    

    【讨论】:

    • 我的form2没有值,你是如何设法在form2上显示值的?
    • @Sarotobi 你说的form2指的是什么?
    • EditUserForm 第一种形式有值但第二种形式不显示任何值
    猜你喜欢
    • 1970-01-01
    • 2011-07-28
    • 1970-01-01
    • 1970-01-01
    • 2018-11-19
    • 1970-01-01
    • 2015-05-18
    • 2012-07-19
    • 1970-01-01
    相关资源
    最近更新 更多