Django. CSRF-токен отсутствует или неверен
Я только недавно начал изучать Django. У меня проблема со страницей смены пароля
403 Причина отказа: CSRF-токен отсутствует или неверен.
Мои пользователи/urls.py
urlpatterns = [
path(
'logout/',
LogoutView.as_view(template_name='users/logged_out.html'),
name='logout'
),
path(
'login/',
LoginView.as_view(template_name='users/login.html'),
name='login'
),
path(
'password_change/',
PasswordChangeView.as_view(template_name='users/password_change_form.html'),
name='password_change_form'
),
path(
'password_change/done/',
PasswordChangeDoneView.as_view(template_name='users/password_change_done.html'),
name='password_change_done'
),
...,
]
И моя форма в шаблоне запускается
<form method="post"
{% if action_url %}
action="{% url action_url %}"
{% endif %}
>
{% csrf_token %}
<input type="hidden" name="csrfmiddlewaretoken" value="">
При использовании этой формы я получаю ошибку 403 и "CSRF-токен отсутствует или неверен."
Без этой строки все работает
<input type="hidden" name="csrfmiddlewaretoken" value="">
Все мысли работают. 1)Не могли бы вы объяснить мне, почему? И что это такое? Как лучше всего использовать csrf? 2) Я тоже раньше писал так
<form method="post" action="{% url 'users:password_change_form' %}">
Но основан этот пример на использовании action_url. Что такое action_url? Какой способ лучше?
Старайтесь использовать только:
{% csrf_token %}
вместо
{% csrf_token %}
<input type="hidden" name="csrfmiddlewaretoken" value="">
Боюсь, что вторая строка кода перезаписала значение csrf_token.
- 'action' в форме указывает, куда отправлять данные формы, когда форма отправлена. В данном случае, после отправки формы, она попадет в приложение 'users', url имя 'password_change_form', затем перейдет в связанное с ней представление. .
action - это атрибут в теге формы. а "action_url" - это URL (страница), на которую она переходит, когда вы нажимаете на кнопку submit. Поэтому вам нужно определить этот URL там. И правильный синтаксис в Django таков :
<form action={% url 'process' %} method="POST">
Здесь process - это имя того URL, который вы определили в файле urls.py. Что-то вроде этого :
path('process/', views.process, name='process')
Для работы вам необходимо иметь этот файл в вашем приложении.
В вашем случае введите имя вашего URL, который вы определили в файле ulrs.py в условии if.