首页 > 解决方案 > Django 表单:在不更改用户名的情况下更新用户的属性

问题描述

我正在尝试创建一个允许用户更新其用户名或头像的表单。我遇到的问题是,如果我在不更改用户名的情况下更新个人资料图片,django 表单验证if form.is_valid()会将表单识别为无效,因为用户名已经存在于数据库中。我正在使用更新视图,但我不确定我是否正确实现了它。

当我尝试在不更改用户名的情况下更新头像时,我会从以下行中看到“表单无效”的页面:HttpResponse("Form is invalid"). 是否有解决方法来删除表单验证?我尝试删除 if form.is_valid():但收到错误'User_form' object has no attribute 'cleaned_data'

我觉得必须有一种我无法找到的简单方法来解决这个问题,因为很多网站一次只允许您更新一个属性。

视图.py

    model = User
    form = User_form
    fields = ['username', 'avatar']
    template_name_suffix = '_update_form'

def update_profile(request, user_id): 
    if request.method == "POST":
        form = User_form(request.POST, request.FILES)
        if form.is_valid():
            user = User.objects.get(pk=user_id)
            username = form.cleaned_data['username']
            avatar = form.cleaned_data['avatar']
            if username != user.username:
                user.username = username
            if avatar != user.avatar: 
                if avatar:
                    user.avatar = avatar
            user.save()
            return redirect('index')
        else:
            return HttpResponse("Form is invalid")

模型.py

class User(AbstractUser):
    followed_by = models.ManyToManyField("User", blank=True, related_name="following")
    avatar = models.ImageField(upload_to='profilepics/', verbose_name='Avatar', null=True, blank=True)

class User_form(ModelForm):
    class Meta: 
        model = User
        fields = ['username', 'avatar']

user_update_form.html

<form action="/profile/{{user.id}}/update" method="post" enctype='multipart/form-data'>
    {% csrf_token %}
    {{ form.as_p }}
    <input type="submit" value="Update">
</form>

标签: djangoformsauthentication

解决方案



推荐阅读