создать страницу профиля с помощью django

Я создал страницу профиля с помощью django, чтобы пользователи могли изменить свою информацию, которую я дал в форме регистрации. (например, имя, адрес электронной почты, пароль)

У меня две проблемы с полем пароля:

1 - когда пользователь вводит пароль в текстовое поле, он отправляется в необработанном формате, и мне нужен формат таблицы пользователя django

<algorithm>$<iterations>$<salt>$<hash>

мой взгляд на страницу профиля:

def user_profile(request):
    current_user = request.user
    form = UserProfileForm(request.POST or None, instance=current_user)
    if request.POST:
        if form.is_valid():
             # pwd = form.cleaned_data['password']
             # form_obj = form.save(commit=False)
             # form_obj.password = make_password(pwd)
             form.save()
             message = "saved successfully"
             return render(request, 'Profile.html', {'form':form, 'message':message}, context_instance=RequestContext(request))

    return render_to_response('Profile.html', {
        'form': form,
    }, context_instance=RequestContext(request))

как вы можете видеть в комментариях, я использовал функцию make_password для хеширования пароля, и она отлично работает, НО после отправки страницы пользователь не может перейти на другие страницы и ему нужно повторно войти в систему ... почему ?!

2 - когда страница профиля показывается пользователю, она заполняется текущей информацией в базе данных, а пароль также находится в указанном выше формате (хэш), и если пользователь отправляет форму без каких-либо изменений в поле пароля, пароль изменяется (он отправляет хэш один и хэш его снова!)

как я могу решить эту проблему и создать простую рабочую страницу профиля в django? (Мне очень не нравится его собственная панель администратора! Она выглядит некрасиво!)


person Amir Khademi    schedule 05.06.2016    source источник


Ответы (1)


Из документации:

Изменение пароля пользователя приведет к выходу из всех его сеансов, если SessionAuthenticationMiddleware включен.

Поэтому вы должны использовать update_session_auth_hash(request, user)

Для получения дополнительной информации см. https://docs.djangoproject.com/en/1.9/topics/auth/default/#session-invalidation-on-password-change

Что касается предварительно заполненного поля пароля: вы должны установить поле как passwordInput, которое по умолчанию не заполняется предварительно, см. https://docs.djangoproject.com/en/1.9/ref/формы/виджеты/#django.forms.PasswordInput

person mastazi    schedule 05.06.2016
comment
оно работает ! спасибо большое а как насчет второй проблемы? - person Amir Khademi; 05.06.2016
comment
в этом случае пользователь должен каждый раз вводить свой пароль (потому что, если он оставит его пустым, он получит сообщение об ошибке, а если он просто введет «Отправить», его пароль изменится на что-то длинное!) - person Amir Khademi; 05.06.2016
comment
Я говорю о второй проблеме в последней части моего ответа, в основном вам нужно изменить свою форму... - person mastazi; 05.06.2016
comment
Извините, я не видел ваш комментарий... Да, я понимаю, что вы имеете в виду, я думаю, вам следует обновить все поля, кроме пароля, и обновить пароль, только если он не пуст... Вы можете сделать это на свой взгляд - person mastazi; 05.06.2016
comment
Кроме того, вы можете захотеть иметь два поля и попросить пользователя ввести новый пароль дважды... Это поможет предотвратить нежелательные ошибки ввода пользователем... - person mastazi; 05.06.2016
comment
И последний совет... Обычно я предпочитаю иметь функцию обновления пароля в отдельной форме... Итак, что я обычно делаю, так это то, что у меня есть форма профиля, в которой вообще нет поля пароля... - person mastazi; 05.06.2016
comment
но поле пароля обязательно, пользователь не может оставить его пустым - person Amir Khademi; 05.06.2016
comment
Вы можете решить, какие поля являются обязательными в форме, см. docs.djangoproject .com/en/1.9/ref/forms/fields/#required - person mastazi; 05.06.2016