Профиль пользователя Django не обновляется - PullRequest
0 голосов
/ 04 марта 2019

Я настраиваю веб-сайт, где пользователи могут видеть свои профили и обновлять данные (например, электронную почту, пароль и т. Д.) / Удалять учетную запись.Но обновление формы вообще не подтверждается пользователем.Я использую стандартную встроенную модель User.

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 %}

1 Ответ

0 голосов
/ 04 марта 2019

Прежде всего, вы не можете изменить такой пароль.Вы должны взять пароль, введенный пользователем, и установить его с помощью user_obj.set_password():

Django docs: Изменить пароль

И для вашей формы:

Вы делаете это неправильно с 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')

представления.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) 
...