Преобразование formData в forms.Form в django

Я хотел бы разрешить пользователю вводить код викторины и получать предупреждение о том, является ли код все еще недействительным без обновления страницы. Я уже прочитал много руководств по Django AJAX и JQuery, но большинство из них кажутся устаревшими, потому что они не охватывают часть, где должен быть отправлен токен csrf.

В моем settings.py я установил для CSRF_USE_SESSIONS значение True.

Это мои формы.py

class codeForm(forms.Form): 
    code = forms.IntegerField(label='Question Code')

В моем html-файле у меня есть это

<form class = "card__form" id = "code-form" method = "POST">
{% csrf_token %}                                <script type = "text/javascript">                                 // using jQuery                             
var csrftoken = jQuery("[name=csrfmiddlewaretoken]").val();                             </script>                                       {{form.as_p}
<center><input type = "submit" class = "btn btn-primary card__submit" id = "submit_code"></center>

Прямо перед тегом у меня есть это:

<script>
    $(document).ready(function(){
        $("#submit_code").click(function(){
            alert("Text: ");

            event.preventDefault();

            var myform = document.getElementById("code-form");
            var form = new FormData(this);

            form.append('csrfmiddlewaretoken', csrftoken);

            $.ajax({
            data : form,
            dataType:'json',
            type: 'POST',
            method: 'POST',
            url: '{% url 'student:process_code' %}',

            contentType: false,
            processData: false,

            success: function(context) {
                alert(context.msg);
            },
            error: function(context) {
                alert(context.msg);
            }
            });

        });
    });
</script>

В моих представлениях.py

def process_code(request):
    context = {}

    if request.method == 'POST':
        form = codeForm(request.POST)
        if form.is_valid():
            cd = form.cleaned_data
            code = cd.get('code')
            print('yay')
            if code.isdigit():

Неожиданным результатом было то, что форма недействительна (form.is_valid() = false). Таким образом, я думаю, что мой объект formData не преобразован в допустимый тип forms.Form. Я также пытался использовать form = codeForm(request.POST['code']), но он возвращает больше ошибок.

Как я могу обойти это? Я предпочитаю не использовать serialize(), потому что я читал, что его нельзя использовать для загрузки файлов, которые будут моей следующей функцией, над которой я буду работать после того, как это уладится. Я хотел использовать form.Form, потому что у него есть метод clean_data. Если бы вы могли предоставить хорошее решение, хотя и не используя формы. Форма, но с хорошей аргументацией, я буду признателен. Большое спасибо

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
457
1

Ответы 1

попробуйте FormData (myform), а не «это»

Это помогло бы объяснить, почему они не должны использовать this.

John Adjei 27.12.2019 19:16

Верно. Насколько я понимаю, вы создаете экземпляр объекта с неправильным параметром (кнопка отправки кода)

Matan Eshed 28.12.2019 20:05

Другие вопросы по теме