【问题标题】:Converting formData to forms.Form in django在 django 中将 formData 转换为 forms.Form
【发布时间】: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 但有充分的理由,我将不胜感激。非常感谢

【问题讨论】:

    标签: ajax django


    【解决方案1】:

    试试 FormData(myform),而不是“这个”

    【讨论】:

    • 这将有助于解释为什么他们不应该使用this
    • 对。据我了解,您使用错误的参数(提交代码按钮)实例化对象
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-12
    • 2023-01-19
    • 2018-09-28
    • 2017-05-16
    • 2021-11-25
    • 2017-09-06
    • 1970-01-01
    相关资源
    最近更新 更多