【发布时间】:2019-08-19 12:24:29
【问题描述】:
我想允许用户输入一个测验代码,并在不刷新页面的情况下获得一个警报,以判断该代码是否仍然无效。我已经阅读了很多 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>
在我看来.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(),因为我读到它不能用于上传文件,这将是我在解决此问题后的下一个功能。我想使用 forms.Form 因为它有 clean_data 方法。如果您可以提供一个很好的解决方案,尽管不使用 forms.Form 但有充分的理由,我将不胜感激。非常感谢
【问题讨论】: