我想允许用户键入测验代码,并在不刷新页面的情况下得到警报以告知代码是否仍然无效。我已经阅读了很多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.Form类型。 我也尝试使用form = codeForm(request.POST ['code']),但返回更多错误。
我该如何解决?我宁愿不使用serialize(),因为我读到它不能用于上传文件,这将是我在解决该问题后可以使用的下一个功能。我想使用Forms.Form,因为它具有cleaned_data方法。如果您可以提供一个好的解决方案,尽管不使用form.Form,但是具有合理的推理,我将不胜感激。非常感谢
答案 0 :(得分:-1)
尝试FormData(myform),而不是“ this”