Python 使用axios进行Django表单集验证
更新2: 我已经放弃了axios,我相信有一种方法,现在我正在使用ajax,并从 观点: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
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)