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? Какой способ лучше?

  1. Старайтесь использовать только:

    {% csrf_token %}

вместо

{% csrf_token %}
 <input type="hidden" name="csrfmiddlewaretoken" value="">

Боюсь, что вторая строка кода перезаписала значение csrf_token.

  1. 'action' в форме указывает, куда отправлять данные формы, когда форма отправлена. В данном случае, после отправки формы, она попадет в приложение 'users', url имя 'password_change_form', затем перейдет в связанное с ней представление.
  2. .

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.

Вернуться на верх