Смена пароля в Django с помощью AJAX - PullRequest
1 голос
/ 03 апреля 2012

Я занимаюсь разработкой веб-сайта и уже включил функцию , позволяющую пользователю сменить свой пароль . Я использую встроенный вид в django.contrib.auth.

Теперь, нам нужно сделать это с помощью AJAX . Я имею в виду, идея состоит в том, чтобы отправить запрос на сервер без перезагрузки всей страницы. Если пароль был изменен правильно, то мне просто нужно показать сообщение, а если нет, форму с ошибками каждого поля.

Я мог бы сделать это , создав для этой цели отдельное представление , но мне интересно есть ли альтернатива ? Я имею в виду, вид должен быть довольно простым, но это уже сделано в django.contrib.auth ...

Ответы [ 2 ]

1 голос
/ 03 апреля 2012

Если бы я выбрал, я бы также пошел с реализацией отдельного представления для вашей цели.

В идеале, если бы django.contrib.auth было повторно реализовано в представлениях на основе классов, вы могли бы повторно использоватьлогику смены пароля и писать свой код только для той части, которая возвращает ответ, более подходящий для AJAX.Но очень жаль, что мы не можем позволить себе такую ​​роскошь, по крайней мере, для django 1.3 или более ранней версии.

Но чтобы ответить на ваш вопрос, да, есть альтернатива (или хак, я бы ее назвал), которая позволяетвам повторно использовать представление в django.contrib.auth.Предполагая, что вы используете jQuery , при отправке формы смены пароля вы делаете запрос AJAX POST на сервер и ожидаете взамен html (как показано ниже).Возвращенный html такой же, как тот, который вы получите при использовании не-AJAX POST.

  var post_url = $form.attr("action");
  $.ajax({
    type: "POST",
    url: post_url,
    data: $form.serialize()
  }).done(function(html) {
    // check the html and use that to determine what message to prompt back to your user
  });
1 голос
/ 03 апреля 2012

Определенно возможно создать подкласс для существующих представлений django.contrib.auth, но я думаю, что написание вашего собственного представления, специфичного для ajax, является лучшим подходом, и в любом случае оно занимает всего несколько строк кода.

Вот как это может выглядеть:

@login_required
def change_password(request):

    if request.is_ajax():
        try:
            # extract new_password value from POST/JSON here, then

            user = User.objects.get(username=request.user.username)
        except User.DoesNotExist:
            return HttpResponse("USER_NOT_FOUND")
        else
            user.set_password(new_password)
            user.save()

        return HttpResponse("OK")
    else:
        return HttpResponse(status = 400)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...