Django TypeError: validate_location () отсутствует 2 обязательных позиционных аргумента: 'location' и 'parcare_on' - PullRequest
0 голосов
/ 22 сентября 2018

Я пытаюсь создать валидатор для своих моделей, но получаю эту ошибку:

validate_location () отсутствует 2 обязательных позиционных аргумента: 'parcare_on' и 'location'

Я хочу на основании дня сбора == parcare_on проверить, доступен ли этот участок для парковки из местоположения или нет.Что я тут не так делаю?

def clean_fields(self, exclude=None):
    super().clean_fields(exclude=exclude)
    q = Parcare.objects.all().filter(parking_on=self.parking_on)
    if self.location in q:
        raise ValidationError(
            _('%(self.location)s is already ocuppied'),
            params={'location': self.location},
        )

Мои модели:

from django.db import models
from django.urls import reverse
from django.db.models.signals import pre_save
from django.utils.text import slugify
from django.conf import settings
from django.utils import timezone
# from datetime import datetime
from django.contrib.auth.models import User
from django.core.exceptions import ValidationError
from django.utils.translation import gettext_lazy as _
from datetime import datetime, timedelta, time
today = datetime.now().date()
tomorrow = today + timedelta(1)
now = datetime.now()
l = now.hour
m=int(now.strftime("%H"))

class ParcareManager(models.Manager):

    def active(self, *args, **kwargs):
        return super(ParcareManager, self).filter(draft=False).filter(parking_on__lte=timezone.now())



class Parcare(models.Model):
    PARKING_PLOT = (
        ('P1', 'Parking #1'), ('P2', 'Parking #2'),('P3', 'Parking #3'),
        ('P4', 'Parking #4'), ('P5', 'Parking #5'),('P6', 'Parking #6'),
        ('P7', 'Parking #7'), ('P8', 'Parking #8'),('P9', 'Parking #9'),
        ('P10', 'Parking #10'),('P11', 'Parking #11'),('P12', 'Parking #12'),
        ('P13', 'Parking #13'),('P14', 'Parking #14'),('P15', 'Parking #15'),
    )
    user = models.ForeignKey(settings.AUTH_USER_MODEL, blank=True, 
                            null=True, default=1, on_delete=True)
    email=models.EmailField(blank=True, null=True)
    parking_on = models.DateField(auto_now=False, auto_now_add=False,
                                  blank=True, null=True,default=tomorrow,
                                  help_text='Alege data cand doresti sa vii in office')
    parking_off = models.DateField(
        auto_now=False, auto_now_add=False, blank=True, null=True, default=tomorrow,help_text='Alege Data Plecarii')  
    numar_masina = models.CharField(max_length=8, default="IF77WXV", 
    blank=True, null=True, help_text='Introdu Numarul Masinii')
    location = models.CharField(max_length=3, blank=True, default="P1",
                                null=True, choices=PARKING_PLOT,
                                help_text='Alege Locul de Parcare Dorit')
    updated = models.DateTimeField(auto_now=True, auto_now_add=False,blank=True, null=True)
    timestamp=models.DateTimeField(auto_now=False, auto_now_add=True,blank=True, null=True)
    venire = models.TimeField(default=time(9, 00), auto_now=False,
     auto_now_add=False, help_text='Alege Ora Venirii')
    plecare = models.TimeField(default=time(
        18, 00), auto_now=False, auto_now_add=False, help_text='Alege Ora Plecarii')
    booked = models.BooleanField(default=1)
    objects = ParcareManager()

    def __str__(self):
        return self.location + " | " + str(self.parking_on) + " | " + str(self.parking_off)

    class Meta:
        verbose_name_plural = "parcare"
        ordering = ["-parking_on"]

    def clean(self):        
        q = Parcare.objects.filter(parking_on=self.parking_on)

        if self.location in q: #nu merge sa filtram si sa vedem daca locul a fost luat deja
            raise ValidationError(_('Sorry this plot is already taken!'))

        if self.parking_on == today:  # merge--vedem dak parcam azi si dak e tecut de ora 16
            raise ValidationError({'parking_on': _('Please book for a date starting tomorrow')})

        if self.parking_off < self.parking_on: #merge-vedem daca bookam in trecut
            raise ValidationError({'parking_off': _('You cant book for a past date!')})
        if m < 17: # se schimba semnul in > cand va fi in productie
            raise ValidationError({'parking_on':_('Sorry the booking session is closed!')})

    # def clean_save(safe):
    #     if self.parking_on != self.parking_off:
    #         delta=self.parking_off-self.parking_on
    #         print(delta)

    def clean_fields(self, exclude=None):
        super().clean_fields(exclude=exclude)
        q = Parcare.objects.all().filter(parking_on=self.parking_on)
        if self.location in q:
            raise ValidationError(
                _('%(self.location)s is already ocuppied'),
                params={'location': self.location},
            )

1 Ответ

0 голосов
/ 22 сентября 2018

Ваша функция валидатора получит только один аргумент, то есть поле, которое она проверяет, в вашем случае просто location.Вместо этого вы должны попытаться выполнить проверку внутри clean_fields, где вы можете получить доступ к обоим полям, а именно, parcare_on и location.Что-то вроде ниже.

class Parcare(models.Model):
    ...
    def clean_fields(self, exclude=None):
        super().clean_fields(exclude=exclude)
        q = Parcare.objects.all().filter(parcare_on=self.parcare_on)
        if self.location in q:
            raise ValidationError(
                _('%(self.location)s is already ocuppied'),
                params={'location': self.location},
            )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...