Django 3: не уверен, почему я получаю ошибку CSRF - PullRequest
0 голосов
/ 30 апреля 2020

Я пишу приложение Django, и моя страница регистрации вызывает ошибку 403:

Запрещено (403)

Ошибка проверки CSRF. Запрос отменен.

Причина, указанная для сбоя:

Маркер CSRF отсутствует или неверен.

Вот представление:

def register(request):
    form = UserCreationForm(request.POST)
    if form.is_valid():
        form.save()
        return redirect('login')
    return render(request, "register.html", {'form' : form})

Вот Форма в соответствующем шаблоне:

{% block content %}
<form method="POST">
    {% csrf_token %}
    {% for field in form %}
    <p>
        {{ field.label_tag }}
        {{ field }}
    </p>
    {% endfor %}
    <button type="submit" class="button">Register</button>
</form>
{% endblock %}

Некоторые важные факты:

(1) Никакие другие страницы на моем сайте не выдают эту ошибку, хотя многим требуются токены CSRF.

(2) Код, который я использую для вставки токена CSRF, в этом шаблоне такой же, как и в других (если только моя тройная проверка не подвела меня).

(3) [вероятно, уместно?] Это единственный Я импортирую форму непосредственно в views.py без предварительного изменения формы. Итак, две строки views.py:

from django.contrib.auth.forms import UserCreationForm
[...]
from foo.forms import FooForm, FooBarForm, UploadFooForm

Любая и вся помощь приветствуется. Я пробовал большинство из того, что я считаю очевидными шагами отладки (удаление строки {% csrf_token%}, чтение выходных данных отладки и обеспечение [я думаю] того, что эти проблемы не относятся ко мне, et c.) .

РЕДАКТИРОВАТЬ: я работаю в Django 3. Я видел другой вопрос и получил ответ о декораторе @csrf_exempt, но я считаю, что соответствующий декоратор больше не доступен в Django 3.

Ответы [ 2 ]

1 голос
/ 30 апреля 2020

Ответ, который я предоставляю, не пригоден для длительного использования, но для игнорирования этой ошибки мы можем использовать встроенные методы декораторов django, просто импортируйте csrf_exempt и добавьте декоратор над функцией, где он показывает ошибку .

from django.views.decorators.csrf import csrf_exempt

@csrf_exempt
def register(request):
    form = UserCreationForm(request.POST)
    if form.is_valid():
        form.save()
        return redirect('login')
    return render(request, "register.html", {'form' : form})

Надеюсь, это поможет, и вы узнали что-то новое, счастливое кодирование ...

0 голосов
/ 30 апреля 2020

попробуйте удалить файл миграции и файл базы данных, затем выполните миграции и повторите миграцию.

...