@sarch

Почему javascript отправляет пустой запрос в Django?

Не могу понять почему json отправляет пустой запрос.

javascript:
var tryout = new XMLHttpRequest();  

const form = document.querySelector("form")  

tryout.open('POST', '/signup/', false);
tryout.setRequestHeader('x-csrf-token', form.querySelector("input[type=hidden]").value);       
tryout.setRequestHeader("Content-Type", "application/json");
tryout.setRequestHeader("Accept", "application/json");
const body = {
'csrfmiddlewaretoken': form.querySelector("input[type=hidden]").value, 
'username': form.querySelector(".test").value, 
'checker': ''
}
tryout.send(JSON.stringify(body));

html:
{% load static %}
<!DOCTYPE html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <title>Document reg</title>
    <link rel="stylesheet" href="{% static 'main/css/style.css' %}">
    <link rel="stylesheet" href="{% static 'main/css/reg_form.css' %}">
</head>
<body>
    <div class="container__regestration">
    <form method="post" class="container_reg_form" novalidate >
        {% csrf_token %}
        <!-- {{form.non_field_errors}}
        {% for f in form %}
        <div>{{ f.label }}:</div>
        <div>{{ f }}</div>
        {% endfor %} -->
        <input type="text" name="username" value="admin" class = "test">
        <input type="email" name="email">
        <input type="password" name="password1">
        <input type="password" name="password2">
        <button type="sumbit">Отправить</button>
        <div>{{error}}</div>
        <div>{{error_username}}</div>
        <div>{{error_email}}</div>
    </form>
    </div>
    <script src="{% static 'main/js/script.js' %}"></script>
</body>
</html>

функция которая отображает:
from .models import CustomUser
from django.shortcuts import render, redirect

def Reg_page (request):
    if request.user.is_authenticated:
        return redirect('account', request.user.slug)
    error = ""
    error_username = ""
    error_email = ""
    if request.method == 'POST':
        if 'checker' in request.POST:
            print('work')
        form = CustomUserCreationFrom(request.POST)
        email = request.POST.get('email')
        nickname = request.POST.get('username')
        if CustomUser.objects.filter(username=nickname).exists():
            error_username = "Данное имя уже занято"
        if CustomUser.objects.filter(email=email).exists():
            error_email = "Данный адрес электронной почты уже занято"
        if (request.POST.get('username').strip() == "") or (request.POST.get('email').strip()  == ""):
            error = "Заполните все поля"
        if re.search('[а-яА-Я]', nickname):
            error_username = "Кирилицу нельзя"
        # Если форма коректна, то она сохраняется
        elif form.is_valid():
            formsv = form.save()
            login(request, formsv)
            request.user.slug = request.user.username
            request.user.save()
            return redirect('accountREDIR')
        elif error_email == "" and error_username == "":
            error = "Неизвестная нам ошибка"
    form = CustomUserCreationFrom()
    content = {
        'error': error,
        'error_username': error_username,
        'error_email': error_email
    }
    return render(request, 'main/registration_form.html', content)

При попытке вывести этот запрос через консоль пайтона он выводит это:
Forbidden (CSRF token missing.): /signup/
[24/Aug/2022 22:04:35] "POST /signup/ HTTP/1.1" 403 2548

А также request.body и request.POST пустые:
b'' //request.body
<QueryDict: {}> //request.POST

Ожидал я увидеть примерно такой результат:
b'csrfmiddlewaretoken=J5xIjlWgbSpYF8PcDWwibHCJfIrzESR7X6pLHDJpYI32j4i2VyHbwW0wbfMGj96f&username=admin&checker=' //request.body
<QueryDict: {'csrfmiddlewaretoken': ['J5xIjlWgbSpYF8PcDWwibHCJfIrzESR7X6pLHDJpYI32j4i2VyHbwW0wbfMGj96f'], 'username': ['admin'], ''cheker': ['']}> //request.POST

Мне надо делать проверку никнейма до того как он нажмет на кнопку после ввода. Пока что я эту функцию не добавил, хочу понять почему не отправляется запрос.
  • Вопрос задан
  • 90 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы