Django表单域清理以检查输入的日期是否在存储的范围内 [英] Django form field clean to check if entered date is in a stored range

查看:121
本文介绍了Django表单域清理以检查输入的日期是否在存储的范围内的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述



所以我试图写一个表单干净的方法,以确保输入的一对日期目前不在模型中存储的日期范围内。想要捕获 fromdate> = value< = todate ,但是我的清洁方法中的过滤器之间的没有得到



任何人都可以提供一些启示?



Models.py

  class Dates(models.Model):
fromdate = models.DateField()
todate = models.DateField()

Forms.py

  class Form(forms.Form):
fromdate = forms.DateField()

todate = forms.DateField()

class Meta:
model = Dates

def clean_fromdate(self):
form_fromdate = self.cleaned_data.get('fromdate')

exists = Dates.objects.filter(fromdate__contains = form_fromdate).exists()
如果存在== True:
ra ise forms.ValidationError(_(A date has been entered for this date))

between = Dates.objects.filter(fromdate__gte = form_fromdate,
todate__lte = form_fromdate).exists( )
如果between == True:
raise forms.ValidationError(_(Period is between this date 1))

return form_fromdate


def clean_todate(self):
form_todate = self.cleaned_data.get('todate')

exists = Dates.objects.filter(todate__contains = form_todate).exists()
if exists == True:
raise forms.ValidationError(_(A period is already entered for this date))

between = PeriodsOfInactivity2012.objects.filter(fromdate__gte = form_todate,
todate__lte = form_todate).exists()
如果between == True:
raise forms.ValidationError(_(此时间已经在此日期之间2)

返回form_todate


解决方案

这应该适合你

 从django导入表单
从模型导入日期

类Form(forms.ModelForm):
fromdate = forms.DateField()
todate = forms.DateField()

class Meta:
model = Dates

def clean(self):
form_fromdate = self.cleaned_data。 get('fromdate')
form_todate = self.cleaned_data.get('todate')
between = Dates.objects.filter(fromdate__gte = form_fromdate,todate__lte = form_todate).exists()
如果之间:
raise forms.ValidationError(此日期之间的时间)
super(Form,self).clean()






编辑

 #views.py 
#!/ usr / bin / env python
# - * - 编码:utf-8 - * -
from django.http import HttpResponse
从django.template导入RequestContex t
from django.shortcuts import render_to_response

from forms import Form

def index(request,template ='index.html'):
form = form()
如果request.method ==POST:
form = Form(request.POST)
如果form.is_valid():
返回HttpResponse(form)

kwvars = {
form:form,
}
return render_to_response(template,kwvars,context_instance = RequestContext(request))






 #forms.py 
从django导入表单
从模型导入日期

类Form(forms.ModelForm):
fromdate = forms.DateField()
todate = forms.DateField )

class Meta:
model = Dates

def clean(self):
form_fromdate = self.cleaned_data.get('fromdate')
form_todate = self.cleaned_data.get('todate')
between = Dates.objects.filter(fromdate__gte = f orm_fromdate,todate__lte = form_todate).exists()
如果之间:
raise forms.ValidationError(此时间已经在此日期1之间)
super(Form,self).clean()






  #index .html 
< html>
< head>
< / head>
< body>
< form action =method =POST>
{%csrf_token%}
{%if form.errors%}
errors:{{form.errors}}
{%endif%}
{{form }}
< input type =submitvalue =submit>
< / form>
< / body>
< / html>


I'm trying to write a form clean method to ensure that an entered pair of dates is not currently covered by date ranges stored in the model.

So I want to catch fromdate >= value <= todate but the between filters in my clean methods aren't getting it.

Can anyone offer some enlightenment?

Models.py

class Dates(models.Model):
    fromdate = models.DateField()
    todate = models.DateField()

Forms.py

class Form(forms.Form):
    fromdate = forms.DateField()

    todate = forms.DateField()

    class Meta:
        model = Dates

    def clean_fromdate(self):
        form_fromdate = self.cleaned_data.get('fromdate')

        exists = Dates.objects.filter(fromdate__contains=form_fromdate).exists()
        if exists == True:
            raise forms.ValidationError(_("A period is already entered for this date"))

        between = Dates.objects.filter(fromdate__gte=form_fromdate,
            todate__lte=form_fromdate).exists()
        if between == True:
            raise forms.ValidationError(_("Period already between this date 1"))

        return form_fromdate


    def clean_todate(self):
        form_todate = self.cleaned_data.get('todate')

        exists = Dates.objects.filter(todate__contains=form_todate).exists()
        if exists == True:
            raise forms.ValidationError(_("A period is already entered for this date"))

        between = PeriodsOfInactivity2012.objects.filter(fromdate__gte=form_todate,
            todate__lte=form_todate).exists()
        if between == True:
            raise forms.ValidationError(_("Period already between this date 2"))

        return form_todate

解决方案

This should work for you

from django import forms
from models import Dates

class Form(forms.ModelForm):
    fromdate = forms.DateField()
    todate = forms.DateField()

    class Meta:
        model = Dates

    def clean(self):
        form_fromdate = self.cleaned_data.get('fromdate')
        form_todate = self.cleaned_data.get('todate')
        between = Dates.objects.filter(fromdate__gte=form_fromdate, todate__lte=form_todate).exists()
        if between:
            raise forms.ValidationError("Period already between this dates")
        super(Form, self).clean()


EDIT

#views.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from django.http import HttpResponse
from django.template import RequestContext
from django.shortcuts import render_to_response

from forms import Form

def index(request, template='index.html'):
    form = Form()
    if request.method == "POST":
        form = Form(request.POST)
        if form.is_valid():
            return HttpResponse(form)

    kwvars = {
        "form": form,
    }
    return render_to_response(template, kwvars, context_instance=RequestContext(request))


#forms.py
from django import forms
from models import Dates

class Form(forms.ModelForm):
    fromdate = forms.DateField()
    todate = forms.DateField()

    class Meta:
        model = Dates

    def clean(self):
        form_fromdate = self.cleaned_data.get('fromdate')
        form_todate = self.cleaned_data.get('todate')
        between = Dates.objects.filter(fromdate__gte=form_fromdate, todate__lte=form_todate).exists()
        if between:
            raise forms.ValidationError("Period already between this date 1")
        super(Form, self).clean()


#index.html
<html>
<head>
</head>
<body>
<form action="" method="POST">
    {% csrf_token %}
    {%  if form.errors %}
        errors: {{ form.errors }}
    {% endif %}
    {{ form }}
    <input type="submit" value="submit">
</form>
</body>
</html>

这篇关于Django表单域清理以检查输入的日期是否在存储的范围内的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆