首页 > 解决方案 > 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>

标签: jquerydjangodjango-forms

解决方案


我无法发表评论,因为我的声誉还不够,但是如果您的意思是它显示的是 html 而不是表单,请尝试将 {% autoescapeoff %} 放在您的 html 顶部,并将 {% endautoescape %} 放在底部。

此外,看起来只是在您的表单中使用 '{% csrf_token %}' 可能会清理您的代码。


推荐阅读