Python 使用axios进行Django表单集验证

Python 使用axios进行Django表单集验证,python,jquery,ajax,django,axios,Python,Jquery,Ajax,Django,Axios,更新2: 我已经放弃了axios,我相信有一种方法,现在我正在使用ajax,并从 观点: def error_checking(request): print('in error checking') if request.POST: form = RiderProfileFormSet(request.POST) print('made it') if form.is_valid(): print('NOT

更新2: 我已经放弃了axios,我相信有一种方法,现在我正在使用ajax,并从

观点:

def error_checking(request):
    print('in error checking')
    if request.POST:
        form = RiderProfileFormSet(request.POST)
        print('made it')
        if form.is_valid():
            print('NOT')
            return JsonResponse({'success': True})
        else:
            print('YES')
            return JsonResponse({'error': form.errors})
我要去哪里

我仍然想学习hwo在axios中实现这一点

更新1: 我可以将表单作为字符串发送到视图中,但在如何对管理表单数据进行ge验证方面遇到了难题。以下是我在尝试的事情,但运气不好。 一:

二:

如果我能弄清楚如何将表单验证为字符串,或者将字符串转换为任何可以使用的格式。is_valid()

原件: 我找了几个小时都没找到。另外,我是编程新手

我正在尝试对Django表单集执行表单验证

我在一个页面上有多个动态添加(javascript)表单。当用户提交表单时,如果表单中存在错误,则表单将被重新发送回注册页面。我试图保留他们的输入

我的解决方案是通过axios执行表单验证。 我的问题是我正在获取django.core.exceptions.ValidationError:['ManagementForm数据丢失或已被篡改']

完全回溯:

[19/Aug/2018 14:39:42]“GET/event registration/?event=Lone%20Wolf HTTP/1.1”200 13455 [19/Aug/2018 14:39:42]“GET/static/events/style.css HTTP/1.1”200 340 [2018年8月19日14:39:42]“发布/事件表单集HTTP/1.1”200 7917 在错误检查中 > 内部服务器错误:/Error\u检查 回溯(最近一次呼叫最后一次): 文件“/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site packages/django/core/handlers/exception.py”,第34行,在内部 响应=获取响应(请求) 文件“/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site packages/django/core/handlers/base.py”,第126行,在“get”响应中 response=self.process\u异常\u由\u中间件(e,请求) 文件“/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site packages/django/core/handlers/base.py”,第124行,在“get”响应中 响应=包装的回调(请求,*回调参数,**回调参数) 文件“/Users/shanecheek/Desktop/projects/lobos/events/views.py”,第164行,在错误检查中 如果formset\u post.有效(): 文件“/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site packages/django/forms/formsets.py”,第301行有效 自我错误 文件“/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site packages/django/forms/formsets.py”,第281行,错误 self.full_clean() 文件“/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site packages/django/forms/formsets.py”,第322行,全文 对于范围内的i(0,self.total_form_count()): 文件“/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site packages/django/forms/formsets.py”,第110行,总计 返回最小值(自我管理表单清理数据[总表单计数]、自我绝对表单最大值) 文件“/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site packages/django/utils/functional.py”,第37行,在get res=instance.dict[self.name]=self.func(实例) 文件“/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site packages/django/forms/formsets.py”,第92行,管理表单 代码=‘缺少管理表格’, django.core.exceptions.ValidationError:['ManagementForm数据丢失或已被篡改']

在正常提交时,我没有这个问题。但是,当我调用vue方法时:

reveal_pay: function (request) {
let app = this
console.log('called the reveal_pay')
axios.post("{% url 'error_checking' %}",
    {
        headers:
            {
                'X-CSRFToken': '{{ csrf_token }}',
            }
    }
)

    .then(function (response) {
        app.formIsValid = response.data.errors
    })},
我认为原因是我没有正确提交表单,没有向函数传递正确的数据:

def error_checking(request):
    print('in error checking')
    print(request.POST.get)
    formset_post = RiderProfileFormSet(request.POST)
    # formset_post = json.loads(request.body)['form_to_validate']
    print(formset_post)

    if formset_post.is_valid():
        print('the formset is valid')
        print('passing to event_register')
        event_register(request)
    else:
        print('formset not valid')
        print(formset_post.errors)
        errors = formset_post.errors
        args = {'errors': errors}
        return JsonResponse(args)
我尝试通过js(form_to_validate=document.getElementById('reg_form')获取表单并将其传递到正文中,但是当我尝试将其用作表单集时,我得到了错误:AttributeError:'str'对象没有属性'errors'

[19/Aug/2018 15:31:02]“获取/事件注册/?事件=Lone%20Wolf HTTP/1.1“200 13464[19/Aug/2018 15:31:02]”获取 /static/events/style.css HTTP/1.1“200 340[19/Aug/2018 15:31:02] 错误检查>表单验证中的“POST/event\u formset HTTP/1.1”200 7917 内部服务器错误:/Error\u检查回溯(最近的调用 最后):文件 “/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site packages/django/core/handlers/exception.py”, 第34行,在内部 response=get_response(请求)文件“/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site packages/django/core/handlers/base.py”, 第126行,在“获取”响应中 response=self.process\u exception\u by_中间件(e,请求)文件“/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site packages/django/core/handlers/base.py”, 第124行,在_get_响应中 response=wrapped_callback(请求,*callback_args,**callback_kwargs)文件“/Users/shanecheek/Desktop/projects/lobos/events/views.py”,第171行, 错误检查 errors=formset\u post.errors AttributeError:'str'对象没有属性'errors'

模板:

<form id='reg_form' class="form-horizontal" method="POST">
    {% csrf_token %}
    {{ formset.management_form }}
    <div style="background-color: black; padding: 20px 60px 20px 60px; margin-right: 15px;"
         class="row form-row">
        <div class="input-group">
            <div v-for="form in formList">
                <br>
                <div style="background-color: #ffe673; padding: 20px" v-html="form">
                </div>
            </div>
            <div style="padding-left: 60px; background-color: black">
                <p v-on:click="addForm" class="btn btn-primary btn-lg">Add Form</p>
                <p v-on:click="formID" class="btn btn-primary btn-lg">Delete Form</p>
                <p v-on:click="totalCost" class="btn btn-primary btn-lg">Total Cost</p>

            </div>

            <br>

            <br>
        </div>
    </div>
    <div style="margin: 0px 15px 100px -15px; padding: 0px 0px 60px 60px; background-color: black">
        {#<button id="form_submit_button" style="" type="submit" class="btn btn-primary btn-lg">Finish Registration</button>#}
        <div id="form_submit_button" v-on:click="reveal_pay"class="btn btn-primary btn-lg">AXIOS Finish Registration</div>
        <div class="btn btn-primary btn-lg">
            <paypal-checkout
                    :amount='amountStr'
                    currency="USD"
                    :button-style="aStyle"
                    :client="paypal"
                    env="sandbox"
                    v-on:payment-authorized="paymentAuthorized"
                    v-on:payment-completed="paymentCompleted"
                    v-on:payment-cancelled="paymentCancelled">
            </paypal-checkout>
        </div>
    </div>
</form>

{%csrf_令牌%}
{{formset.management_form}

点击添加表单

点击删除表格

总成本



{完成注册} AXIOS完成注册
如果您需要其他信息,请告诉我。第一次在这里问问题。
-谢谢

长话短说。Django获取一个JSON对象,然后将其传递给
# request_data = json.load(request)  # The form as a dict {'form_to_validate': '<form id="reg_form" method.....}
#Error: ValidationError: ['ManagementForm data is missing or has been tampered with']
# request_data = RiderProfileFormSet(request.POST)
#Error: ValidationError: ['ManagementForm data is missing or has been tampered with']



formset_post = RiderProfileFormSet(request_data)



if formset_post.is_valid():
    print('the formset is valid')
reveal_pay: function (request) {
let app = this
console.log('called the reveal_pay')
axios.post("{% url 'error_checking' %}",
    {
        headers:
            {
                'X-CSRFToken': '{{ csrf_token }}',
            }
    }
)

    .then(function (response) {
        app.formIsValid = response.data.errors
    })},
def error_checking(request):
    print('in error checking')
    print(request.POST.get)
    formset_post = RiderProfileFormSet(request.POST)
    # formset_post = json.loads(request.body)['form_to_validate']
    print(formset_post)

    if formset_post.is_valid():
        print('the formset is valid')
        print('passing to event_register')
        event_register(request)
    else:
        print('formset not valid')
        print(formset_post.errors)
        errors = formset_post.errors
        args = {'errors': errors}
        return JsonResponse(args)
<form id='reg_form' class="form-horizontal" method="POST">
    {% csrf_token %}
    {{ formset.management_form }}
    <div style="background-color: black; padding: 20px 60px 20px 60px; margin-right: 15px;"
         class="row form-row">
        <div class="input-group">
            <div v-for="form in formList">
                <br>
                <div style="background-color: #ffe673; padding: 20px" v-html="form">
                </div>
            </div>
            <div style="padding-left: 60px; background-color: black">
                <p v-on:click="addForm" class="btn btn-primary btn-lg">Add Form</p>
                <p v-on:click="formID" class="btn btn-primary btn-lg">Delete Form</p>
                <p v-on:click="totalCost" class="btn btn-primary btn-lg">Total Cost</p>

            </div>

            <br>

            <br>
        </div>
    </div>
    <div style="margin: 0px 15px 100px -15px; padding: 0px 0px 60px 60px; background-color: black">
        {#<button id="form_submit_button" style="" type="submit" class="btn btn-primary btn-lg">Finish Registration</button>#}
        <div id="form_submit_button" v-on:click="reveal_pay"class="btn btn-primary btn-lg">AXIOS Finish Registration</div>
        <div class="btn btn-primary btn-lg">
            <paypal-checkout
                    :amount='amountStr'
                    currency="USD"
                    :button-style="aStyle"
                    :client="paypal"
                    env="sandbox"
                    v-on:payment-authorized="paymentAuthorized"
                    v-on:payment-completed="paymentCompleted"
                    v-on:payment-cancelled="paymentCancelled">
            </paypal-checkout>
        </div>
    </div>
</form>
<form v-on:submit.prevent="the3DayMethod" method="POST" id="feedbackform">
    {% csrf_token %}
    {{ formset.management_form }}
    <div style="background-color: black; padding: 20px 60px 20px 60px; margin-right: 15px;"
         class="row form-row">
        <div class="input-group">
            <div v-for="form in formList">
                <br>
                <div style="background-color: #ffe673; padding: 20px" v-html="form">
                </div>
            </div>
            <div style="padding-left: 60px; background-color: black">
                <p v-on:click="addForm" class="btn btn-primary btn-lg">Add Form</p>
                <p v-on:click="formID" class="btn btn-primary btn-lg">Delete Form</p>
            </div>
            <br>
        </div>
    </div>
    <div style="margin: 0px 15px 100px -15px; padding: 0px 0px 60px 60px; background-color: black">
        <div v-show="formIsValid === 'False'">
            <input v-on:click="the3DayMethod" class="btn btn-primary" value=" Check for Errors">
        </div>
        <div v-show="formIsValid === 'True'" class="btn btn-primary btn-lg">
            <paypal-checkout
                    :amount='amountStr'
                    currency="USD"
                    :button-style="aStyle"
                    :client="paypal"
                    env="sandbox"
                    v-on:payment-authorized="paymentAuthorized"
                    v-on:payment-completed="paymentCompleted"
                    v-on:payment-cancelled="paymentCancelled">
            </paypal-checkout>
        </div>
    </div>
</form>
the3DayMethod: function () {
    let app = this
    var object = {}
    forms = document.getElementById('feedbackform')

    var formData = new FormData(forms),
        result = {};
    for (var entry of formData.entries()) {
        result[entry[0]] = entry[1];
    }
    data = JSON.stringify(result)
    console.log(result);
    console.log('called the the3DayMethod')


    axios.post("{% url 'error_checking' %}",
        data,
        {
            headers:
                {
                    'X-CSRFToken': '{{ csrf_token }}',
                }
        }
    )
        .then(function (response) {
            app.formIsValid = response.data.errors
        })
},
def error_checking(request):

    forms = json.load(request)

    formset = RiderProfileFormSet(forms)

    if formset.is_valid():
        print('VALID')
        v = {'success': "True"}
        return JsonResponse(v)
    else:
        print('NOT VALID')
        v = {'error': formset.errors}
        return JsonResponse(v)