【问题标题】:Django form error - cannot validate as input field is requiredDjango 表单错误 - 无法验证,因为需要输入字段
【发布时间】: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_timeend_time 字段,而不是start_dateend_date
  • 谢谢 - 我的表单验证了!但是开始/结束时间仍然没有附加到我的表格中 - 这是我打印表格时得到的。有任何想法吗? &lt;tr&gt;&lt;th&gt;&lt;label for="id_start_date"&gt;Start date:&lt;/label&gt;&lt;/th&gt;&lt;td&gt;&lt;input id="id_start_date" name="start_date" type="date" /&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt;&lt;th&gt;&lt;label for="id_end_date"&gt;End date:&lt;/label&gt;&lt;/th&gt;&lt;td&gt;&lt;input id="id_end_date" name="end_date" type="date" /&gt;&lt;/td&gt;&lt;/tr&gt;
  • 在您的 HTML 文件中,表单控件被命名为 trip-starttrip-end 而不是 start_dateend_date

标签: jquery django django-forms


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-05
    • 1970-01-01
    • 1970-01-01
    • 2019-12-04
    • 2021-01-01
    • 2018-08-08
    • 2019-01-30
    • 2023-03-14
    相关资源
    最近更新 更多