简体   繁体   English

Django CreateView显示错误不起作用

[英]Django CreateView show error not working

how i can prevent the Repetition of renting a car for the same period the car was already rented or reserved for ex : 01/01/2017 to 01/03/2017 if i trie to rent this car for a period between this dates " 01/01/2017 to 01/03/2017" it should give me a error like the validation error in the right of the field 如果我尝试在此日期之间的一段时间内租用这辆车,如何防止重复租用该车(例如,01/01/2017至01/03/2017)? 2017年1月1日至2017年3月1日”,它应该给我一个错误,例如字段右侧的验证错误

screen shot for my rental car app 我的租车应用程序的屏幕截图

models.py models.py

class Car(models.Model):

    imatriculation = models.CharField(max_length=100, primary_key=True)
    marque = models.CharField(max_length=100)
    couleur = models.CharField(max_length=100)

class Contra(models.Model):

    car = models.ForeignKey(Car, on_delete=models.CASCADE)
    date_debut = models.DateField(null=True ,blank=True)
    heure_debut = models.TimeField(null=True ,blank=True)
    date_retour = models.DateField(null=True ,blank=True)
    heure_retour = models.TimeField(null=True ,blank=True)

forms.py forms.py

class CarForm(forms.ModelForm):

    class Meta:
        model = Car
        fields = ('imatriculation', 'marque',  'couleur')       


class ContraForm(forms.ModelForm):

    date_debut = forms.DateField(widget = AdminDateWidget())
    heure_debut = forms.TimeField(widget = AdminTimeWidget())
    date_retour = forms.DateField(widget = AdminDateWidget())
    heure_retour = forms.TimeField(widget = AdminTimeWidget())

    class Meta:
        model = Contra
        fields = ('car','date_debut','heure_debut',  
                 'date_retour','heure_retour')

views.py views.py

class ContraCreate(CreateView):
    template_name = 'rentcar/contra_update.html'
    form_class = ContraForm
    model = Contra

    def form_valid(self, form):
                now_date = date.today()
                now_time = datetime.now().strftime('%H:%M:%S')
                x = Contra.objects.filter(location=self.request.user,
                    date_debut__lte=now_date, date_retour__gte=now_date)
                c = form.instance.car
                for e in x:
                    if c.imatriculation ==  e.car.imatriculation :
                    print ("Leased car")
                    ValidationError(_('Invalid value'))
                    return super(ContraCreate, self).form_invalid(form)
                return super(ContraCreate, self).form_valid(form) 

i find a solution using clean 我找到了使用清洁的解决方案

def clean(self):
    super(ContratForm, self).clean()
    form_car          = self.cleaned_data.get('car')    
    form_date_debut   = self.cleaned_data.get('date_debut')
    form_date_retour  = self.cleaned_data.get('date_retour')
    form_heure_debut  = self.cleaned_data.get('heure_debut')
    form_heure_retour = self.cleaned_data.get('heure_retour')
    h                 = form_car.imatriculation

    x1  = Contrat.objects.filter(location=self.user,car=h ,date_debut__lte=form_date_debut,date_retour__gte=form_date_retour)
    x2  = Contrat.objects.filter(location=self.user,car=h ,date_debut__gt=form_date_debut,date_debut__lt=form_date_retour,date_retour__gte=form_date_retour)
    x25 = Contrat.objects.filter(location=self.user,car=h ,date_debut__gt=form_date_debut,date_debut=form_date_retour,heure_debut__lt=form_heure_retour)
    x3  = Contrat.objects.filter(location=self.user,car=h ,date_debut__lte=form_date_debut,date_retour__gt=form_date_debut,date_retour__lt=form_date_retour)
    x35 = Contrat.objects.filter(location=self.user,car=h ,date_debut__lte=form_date_debut,date_retour=form_date_debut,heure_retour__gt=form_heure_debut)
    x4  = Contrat.objects.filter(location=self.user,car=h ,date_debut__gt=form_date_debut,date_retour__lt=form_date_retour)


    if x1:
        for k in x1:
            self._errors['car']          = "Deja reserve .contrat %s" %(k.id)
            self._errors['date_debut']   = k.date_debut.strftime('%d/%m/%Y')
            self._errors['date_retour']  = k.date_retour.strftime('%d/%m/%Y')
    elif x2:
        for k in x2:
            self._errors['car']          = "Deja reserve .contrat %s" %(k.id)
            self._errors['date_retour']  = ("<= %s" %(k.date_debut).strftime('%d/%m/%Y'))
    elif x25:
        for k in x25:
            self._errors['car']          = "Changer l'heur retour"
            self._errors['date_retour']  = ("= Date depart contrat %s" %(k.id))
            self._errors['heure_retour'] = ("< %s" %(k.heure_debut))
    elif x3:
        for k in x35:
            self._errors['car']          = "Deja reserve .contrat %s" %(k.id)
            self._errors['date_debut']   = (">= %s" %(k.date_retour).strftime('%d/%m/%Y'))
    elif x35:
        for k in x35:
            self._errors['car']          = "Changer l'heur de depart"
            self._errors['date_debut']   = ("= Date debut contrat %s" %(k.id))
            self._errors['heure_debut']  = ("> %s" %(k.heure_retour))
    elif x4:
        for k in x4:
            self._errors['car']          = "Deja reserve .contrat %s" %(k.id)
            self._errors['date_debut']   = k.date_debut.strftime('%d/%m/%Y')
            self._errors['date_retour']  = k.date_retour.strftime('%d/%m/%Y')

    return self.cleaned_data

By the time form_valid in the view is called, Django has already decided that the form is valid. 到视图中的form_valid调用时,Django已经确定该表单有效。 Check out what the docs say about how validation works. 看看文档中有关验证如何工作的内容。

The extra validation you want to do against data in the database already can be done by overriding the clean stage of validation in the form. 您想要对数据库中的数据进行额外的验证,可以通过覆盖表单中的干净验证阶段来完成。

A solution based on your above code would look something like: 基于上述代码的解决方案如下所示:

def clean(self):
    '''This goes in ContraForm.py'''
    cleaned_data = super(ContraForm, self).clean()
    now_date = date.today()
    now_time = datetime.now().strftime('%H:%M:%S')
    x = Contra.objects.filter(location=self.request.user,
                date_debut__lte=now_date, date_retour__gte=now_date)
    c = form.instance.car
    for e in x:
        if c.imatriculation ==  e.car.imatriculation :
            raise ValidationError('Invalid debut date. Car already reserved.')
    return cleaned_data

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM