jquery - Django 表单错误 - 无法验证,因为需要输入字段
问题描述
我正在尝试将 html5 日期输入(开始和结束日期)传递到 django 表单中,主要目标是根据用户在前端指定的开始/结束日期查询订单。用户在前端指示开始和结束日期,然后将其传递到我的 django 模型和 AJAX 调用中。
我当前的错误是:我无法将开始/结束日期附加到我的表单或输入if form.is_valid()
我的代码部分。当我print(form.error)
,我得到:<ul class="errorlist"><li>start_time<ul class="errorlist"><li>This field is required.</li></ul></li><li>end_time<ul class="errorlist"><li>This field is required.</li></ul></li></ul>
我不明白为什么会出现此错误 - 发出 POST 请求并设法检索我的开始和结束日期:<QueryDict: {u'csrfmiddlewaretoken': [u'FDRiqkYiP6j8yOAMLfb0sMe8wC8Z0K57'], u'start_date': [u'2018-12-17'], u'end_date': [u'2018-12-20']}>
- 指定的字段显然不为空。
我的有什么问题forms.py
吗?非常感谢一些帮助。谢谢!
views.py方法
from django.shortcuts import render, get_object_or_404
from django.http import HttpResponse, Http404
from django.contrib import messages
from django.utils import simplejson # JsonResponse
from django.middleware.csrf import get_token
from django.db.models import Count
from django.views.generic import View
from .forms import DateInput, DateForm
from .models import Member, Driver, Order, Distance
from collections import OrderedDict
def date_input(request):
if request.method == "POST":
print(request.POST)# prints: <QueryDict: {u'csrfmiddlewaretoken': [u'FDRiqkYiP6j8yOAMLfb0sMe8wC8Z0K57'], u'start_date': [u'2018-12-17'], u'end_date': [u'2018-12-20']}>
start_date = request.POST.get("start_date", None) # type unicode
end_date = request.POST.get("end_date", None)
form = DateForm(request.POST or None)
print(form.errors) # prints: <ul class="errorlist"><li>start_time<ul class="errorlist"><li>This field is required.</li></ul></li><li>end_time<ul class="errorlist"><li>This field is required.</li></ul></li></ul>
if form.is_valid():
start_date = form.cleaned_data['start_date']
end_date = form.cleaned_data['end_date']
form.save()
form = DateForm()
print("----")
print(form)
print("form validated")
else:
print("form is not valid")
else:
form = DateForm()
print("form is not valid")
# print(form)
return render(request, 'date_input.html', {
"form": form
})
表格.py
from django import forms
class DateInput(forms.DateInput): # pass date as widget to DateForm
input_type = 'date'
class DateForm(forms.Form):
# CHANGE DATEINPUT TO DATEFORM
start_time = forms.DateTimeField(widget=DateInput)
end_time = forms.DateTimeField(widget=DateInput)
def process(self):
cleaned = self.cleaned_data
.html 文件
{% load static %}
{% block content %}
<div class="date">
<br>
<h3>Select to view distance and orders by timeframe</h3>
<form name="date-input" method="POST" action="/date-input/">
<label for="start">Start date:</label>
<input type="date" id="start" name="trip-start" value="2018-12-01" min="2018-12-01" max="2019-06-30">
<label for="end">End date:</label>
<input type="date" id="end" name="trip-end" value="2018-12-01" min="2018-12-01" max="2019-07-01">
<br>
<br>
</form>
</div>
{% endblock content %}
<script src="https://code.jquery.com/jquery-3.5.1.js"></script>
<script>
var start_date = $("#start").val(); // const can't be re-assigned or redeclared
var end_date = $("#end").val();
function ajaxRequest (){
var start_date = $("#start").val();
var end_date = $("#end").val();
$.ajax({ // initialize an AJAX request
type: "POST",
url: '/date-input/', // calls data from /date-input/ endpoint
data: {
'start_date': start_date, // add the order id to the POST parameters
'end_date': end_date,
'csrfmiddlewaretoken': "{{csrf_token}}",
},
success: function (data) { // `data` is from `homepage` view function
console.log("this block of code isn't useless!!")
console.log(data.start_date)
console.log(data.end_date)
},
error: function (data, xhr, status, error) {
console.log("yikes")
}
});
}
$("#start, #end").change(function() { // calling select id
start_date = $("#start").val();
end_date = $("#end").val(); // get the selected subject ID from the HTML dropdown list
if (start_date < end_date) {
ajaxRequest();
}
});
</script>
解决方案
我无法发表评论,因为我的声誉还不够,但是如果您的意思是它显示的是 html 而不是表单,请尝试将 {% autoescapeoff %} 放在您的 html 顶部,并将 {% endautoescape %} 放在底部。
此外,看起来只是在您的表单中使用 '{% csrf_token %}' 可能会清理您的代码。
推荐阅读
- c - 线程调用 pthread_wait 现在发出信号后执行在哪里发生?
- angular - 来自 api 的映射响应返回未定义的数据
- flutter - 如何修复 Flutter 版本解决空安全问题?
- c - 为什么您需要使用 MPI_probe 查找长度,而您还要在发送/接收函数中指示消息长度?
- c - 动态内存分配和指针相关概念疑惑
- c++ - 我陷入的竞争性编程问题
- r - 数据框列表转换因子的自定义函数
- html - 为什么我的 HTML 代码中的标签在我的浏览器上没有按顺序显示?
- python - 在 robotsframework-eclipse-python 中创建测试套件
- emacs - 如何在 Emacs 的配置文件中设置包的可执行路径?