【问题标题】:Django User Profile doesn't updateDjango 用户配置文件不更新
【发布时间】:2019-03-04 17:43:13
【问题描述】:

我正在Django 中建立一个网站,用户可以在其中查看他们的个人资料并更新详细信息(如电子邮件、密码等)或删除自己的帐户。但是用户根本不承认更新表单。我正在使用标准的内置用户模型。

forms.py:

class UserDetailsForm(forms.ModelForm):
    password = forms.CharField(widget = forms.PasswordInput())
class Meta:
    model = User
    fields = ('first_name','last_name','email','password','is_active')

views.py:

@login_required
def edit_profile(request):
    user = User.objects.get(username=request.user)
    form = UserDetailsForm(request.POST or None,
                       initial={'first_name':user.first_name,
                                'last_name':user.last_name,
                                'email':user.email,
                                'password':user.password,
                                'is_active':user.is_active,})
    if request.method == 'POST':
        if form.is_valid():
            user.save()
            messages.info(request, 'This is a debug message')
            return HttpResponseRedirect(reverse('account'))

    context = {"form": form}

return render(request, "iFood/user-account.html", context)    

user-profile.html:

...
<form method="POST" action="{% url 'account' %}" class="" enctype="multipart/form-data">
{% csrf_token %}
        {{form.as_p}}
        <input type="submit" name="" value="Edit and Save">
            {% if messages %}
            <ul class="messages">
                {% for message in messages %}
                <li class="{{ message.tags }}">
                    {{ message }}
                </li>
                {% endfor %}
            </ul>
            {% endif %}

【问题讨论】:

  • 您永远不会将user 与form 相关联,并且您永远不会保存表单中提交的数据,那么您为什么会期望发生一些事情呢? user.save() 只是保存用户对象,不变。阅读this 了解如何为表单指定实例并保存它。
  • 另请注意,您不能以这种方式显示和更改用户的密码。首先,如果您使用 Django 标准身份验证,则没有用户密码(幸运的是!)。其次,如果用户更改密码,您需要使用set_password() 模型上的set_password() 方法将其保存为哈希。

标签: python django django-users


【解决方案1】:

首先,您不能像那样更改密码。您应该使用用户输入的密码并将其设置为user_obj.set_password():

Django docs: Change password

对于你的表格:

你对user.save() 做错了。没有什么可以为用户对象保存的。您应该使用form.save() 保存表单。

另外request.user 是实际的用户对象而不是用户名。

forms.py:

class UserDetailsForm(forms.ModelForm):
    password = forms.CharField(widget = forms.PasswordInput())
    class Meta:
        model = User
        fields = ('first_name','last_name','email'','is_active')

views.py:

@login_required
def edit_profile(request):
    user = request.user
    form = UserDetailsForm(request.POST or None, instance=user)
    if request.method == 'POST':
        if form.is_valid():
            # Save the changes but password
            form.save()

            # Change password
            new_password = form.cleaned_data.get('password')
            if new_password:
                user.set_password(new_pass)
            messages.info(request, 'This is a debug message')
            return HttpResponseRedirect(reverse('account'))

    context = {"form": form}

    return render(request, "iFood/user-account.html", context) 

【讨论】:

  • 但是 OP 还必须使用用户实例正确初始化表单。
  • @dirkgroten 不确定 django 是否关心这一点(从未测试过),但我将其编辑了。谢谢。
  • 我的意思是你需要将instance=user 传递给表单初始化程序,而不是initial={...}。否则form.save() 将尝试保存一个新的User。
  • 是的,我也错过了。已添加。
  • initial 是多余的,如果有instance,则最初将使用实例的值填充值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-02
  • 2016-11-20
  • 2013-03-15
  • 1970-01-01
  • 2020-08-31
  • 1970-01-01
  • 2022-01-03
相关资源
最近更新 更多