Удалите учетную запись пользователя Django, а затем верните редирект и визуализацию - PullRequest
0 голосов
/ 25 февраля 2019

Я хочу разрешить пользователю удалять свою учетную запись, и после удаления я хочу, чтобы пользователь вышел из системы и увидел HTML-страницу account_deleted.html для подтверждения.

student / views.py:

def delete_account(request):
    user = User.objects.get(username=request.user)
    user.delete()

    context = {
        "deleted_msg": "Account has been deleted",
    }
    return render(request, "students/account_deleted.html", context) and redirect("students:logout")

Для выхода из системы я использую встроенную функцию LogoutView.URL перенаправления выхода из системы в файле settings.py установлен на мою домашнюю страницу.

student / urls.py:

path('logout/', LogoutView.as_view(), name='logout'),

В случае удаления учетной записи, как можно заставить функцию delete_account(request) одновременно возвращать визуализацию и перенаправление?Это вообще возможно?Спасибо!

Ответы [ 2 ]

0 голосов
/ 25 февраля 2019

Перво-наперво: ваш взгляд должен 1 / принимать только зарегистрированных пользователей и 2 / только POST-запросы (вам определенно не нужен GET-запрос для удаления чего-либо из вашей базы данных).Кроме того, это:

User.objects.filter(username=request.user)

бесполезно - у вас уже есть текущий пользователь в request.user - и потенциально опасно, если ваш бэкэнд аутентификации допускает дублирование имен пользователей.

и это:

return render(request, "students/account_deleted.html", context) and redirect("students:logout")

, конечно, неправильно.Представление возвращает один единственный HTTP-ответ, вы не можете вернуть два (это не имеет никакого смысла), и вы не можете "и" два ответа вместе (ну, вы можете, но результат определенно не тот, который вы ожидаете -прочтите FineManual об операторе and).

Правильное решение - 1 / вручную выйти из системы (ответ voodoo-burger), 2 / использовать структуру сообщений длясообщите пользователю, что ее учетная запись была удалена, и 3 / перенаправьте на домашнюю страницу (вы ВСЕГДА хотите перенаправить после успешного сообщения, cf https://en.wikipedia.org/wiki/Post/Redirect/Get для причины).

0 голосов
/ 25 февраля 2019

Вы можете выйти из системы до удаления учетной записи, поместив logout(request) перед строкой user.delete().Вам нужно будет импортировать его с from django.contrib.auth import logout.

. Как сказал Бруно в своем ответе, использование перенаправления вместо render предпочтительнее после запроса POST, и вы должны обновить свое представление, чтобы отвечать только на POST.запросов.

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

...