【发布时间】:2021-06-21 10:34:32
【问题描述】:
我正在尝试将 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
})
forms.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>
【问题讨论】:
-
您的表单具有
start_time和end_time字段,而不是start_date和end_date。 -
谢谢 - 我的表单验证了!但是开始/结束时间仍然没有附加到我的表格中 - 这是我打印表格时得到的。有任何想法吗?
<tr><th><label for="id_start_date">Start date:</label></th><td><input id="id_start_date" name="start_date" type="date" /></td></tr> <tr><th><label for="id_end_date">End date:</label></th><td><input id="id_end_date" name="end_date" type="date" /></td></tr> -
在您的 HTML 文件中,表单控件被命名为
trip-start和trip-end而不是start_date和end_date。
标签: jquery django django-forms