Django form field clean to check if entered date is in a stored range

前端 未结 1 1428
旧巷少年郎
旧巷少年郎 2021-01-05 23:54

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

相关标签:
1条回答
  • 2021-01-06 00:16

    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>
    
    0 讨论(0)
提交回复
热议问题