将Django的formData转换为forms.Form

时间:2019-03-28 16:26:35

标签: 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.Form类型。 我也尝试使用form = codeForm(request.POST ['code']),但返回更多错误。

我该如何解决?我宁愿不使用serialize(),因为我读到它不能用于上传文件,这将是我在解决该问题后可以使用的下一个功能。我想使用Forms.Form,因为它具有cleaned_data方法。如果您可以提供一个好的解决方案,尽管不使用form.Form,但是具有合理的推理,我将不胜感激。非常感谢

1 个答案:

答案 0 :(得分:-1)

尝试FormData(myform),而不是“ this”