Преобразование FormData в формы.Форма в django

#ajax #django

#ajax #django

Вопрос:

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

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

Это мой forms.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>
  

В моем views.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 не преобразован в допустимые формы.Тип формы.
Я также пытался использовать form = codeForm (запрос.ОПУБЛИКОВАТЬ[‘code’]), но это возвращает еще одну ошибку.

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

Ответ №1:

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

Комментарии:

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

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