比较日期并验证] 在 django

Posted

技术标签:

【中文标题】比较日期并验证] 在 django【英文标题】:compare dates and validate] in django 【发布时间】:2013-06-18 19:45:56 【问题描述】:

forms.py

class SearchFilterForm(Form):
    fromdate = forms.CharField(widget=forms.TextInput(attrs='placeholder': 'dd/mm/yy','class':'datefield','readonly':'readonly'))
    todate = forms.CharField(widget=forms.TextInput(attrs='placeholder': 'dd/mm/yy','class':'datefield','readonly':'readonly'))

javascript

function comparedate()
        var fromdate = document.getElementById("id_fromdate").value;
        var todate = document.getElementById("id_todate").value;
        if(fromdate<todate)
        
        $("#error-warning").show();
        $("#error-warning").text("Please correct the To date");          
        return false;        
    

 

模板.html

<button type="submit" name="filter" onclick="comparedate()">Go <img src="/static/images/button-icon-ir-fwd.png"   ></button><div id="error-warning" style="display:none" class="errorlist">Please correct the To date</div>

此代码用于验证起始日期和截止日期。验证正在进行,但在验证后表单再次提交。这用于搜索报告功能,因此如果输入的截止日期小于起始日期,则会显示错误消息,它去搜索,这不应该发生。

谁能告诉我会是什么问题

【问题讨论】:

如果您将 onclick 放在提交上,则提交可能发生在验证发生之前或之后(也取决于页面是否正在导航)尝试在您的日期字段上使用 api.jquery.com/change 并使用 @ 比较日期987654322@ 这样您就可以在值更改时立即比较日期,而无需等待用户单击按钮 【参考方案1】:

这个问题我们有不同的解决方案,你可以试试

<button type="submit" name="filter" onclick="javascript:return comparedate();"> Go<img src="/static/images/button-icon-ir-fwd.png"   ></button><div id="error-warning" style="display:none" class="errorlist">Please correct the To date</div>

【讨论】:

【参考方案2】:

你试过吗? https://docs.djangoproject.com/en/dev/ref/validators/

如果您想对多个字段进行验证,您可以在表单的 clean 方法中执行此操作,因此在您的搜索表单中您将拥有:

class SearchFilterForm(Form):

    def clean(self):
        if self.fromdate < self.todate:
            raise ValidationError('Please correct the To date')
        return self.cleaned_data

那么在您看来,您将拥有:

if form.is_valid():
    ...

您可以在模板中使用:

 form.non_field_errors 

或者,您可以手动设置字段错误,而不是引发 ValidationError:

self._errors['todate'] = 'Please correct this'

在模板中你可以使用:

form.todate.errors

【讨论】:

按照相同的过程得到错误“'SearchFilterForm'对象没有属性'fromdate'” 啊抱歉,应该是 self.cleaned_data['fromdate'] 我相信 看看我尝试了什么 def clean(self): fromdate=self.cleaned_data['fromdate'] todate=self.cleaned_data['todate'] if fromdate 您是否在视图中的任何位置使用 from.is_vaild()? 是的,我正在使用 searchform.is_valid():在 views.py 中【参考方案3】:
document.getElementById("button_id").disabled = true

$("id_todate").change(function() 
    var fromdate = document.getElementById("id_fromdate").value;
    var todate = document.getElementById("id_todate").value;

    if (Date.parse(fromdate) > Date.parse(todate))  
        $("#error-warning").hide();
        document.getElementById("button_id").disabled=false;   
    else
        $("#error-warning").show();
        $("#error-warning").text("Please correct the To date"); 
    


<button type="submit" name="filter" id="button_id" disabled>Go <img src="/static/images/button-icon-ir-fwd.png"   ></button>
<div id="error-warning" style="display:none" class="errorlist">Please correct the To date</div>

修改:

<html>
    <script type="text/javascript" src="jquery-1.10.1.min.js" ></script>
    <input type="date" id="id_fromdate" />
    <input type="date" id="id_todate" />
    <input type="submit" name="filter" id="button_id" disabled />
    <div id="error-warning" style="display:none" class="errorlist">Please correct the To date</div>
    <script type="text/javascript">
        $("input[type='date']").change(function() 
            var fromdate = document.getElementById("id_fromdate").value;
            var todate = document.getElementById("id_todate").value;

            if (Date.parse(fromdate) > Date.parse(todate))  
                //console.log(fromdate)
                //console.log(todate)
                    $("#error-warning").hide();
                    document.getElementById("button_id").disabled=false;   
            else
                //console.log(fromdate)
                //console.log(todate)
            document.getElementById("button_id").disabled=true;   
                    $("#error-warning").show();
                    $("#error-warning").text("Please correct the To date"); 
            
        )
    </script>

【讨论】:

我检查了你的答案,验证不起作用,按钮单击没有发生,在控制台中我收到此错误“未捕获的类型错误:无法设置属性‘禁用’为空” 嗨,请检查我修改后的代码以及 html。我认为它现在可以工作了。您可能需要根据您的 html 代码修改代码.. 我已经在使用带有日期字段的日期选择器,在 html 中您再次初始化了日期字段的字段,我尝试了相同的代码,提交按钮 onclick 没有发生。控制台中没有错误我没有不知道它是否在 html 文件中工作,因为我使用 django 框架直接在我的应用程序中应用了答案。将检查其他 html 页面恢复您。

以上是关于比较日期并验证] 在 django的主要内容,如果未能解决你的问题,请参考以下文章

Joi 验证 - 与 POST 中的日期进行比较

Django ModelForm 日期验证

MVC 自定义验证:比较两个日期

日期范围验证

Django 自定义字段验证器 vs. clean

由 sysdate 相关日期验证器引起的合成/冗余 Django 迁移