#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. Правильно. Насколько я понимаю, вы создаете экземпляр объекта с неправильным параметром (кнопка отправки кода)