簡體   English   中英

Django:表單驗證錯誤:['“”值的日期格式無效。 它必須是 YYYY-MM-DD 格式。']

[英]Django: Form ValidationError: ['“” value has an invalid date format. It must be in YYYY-MM-DD format.']

我有一個表單,其中有幾個字段是日期。 用戶將以 DD/MM/YYYY 格式輸入這些日期。 首先,我使用forms.DateField()來存儲由於日期格式而forms.DateField()錯誤的值。 因此,將它們更改為CharField並嘗試重新格式化這些日期,以在干凈的方法中以 YYYY-MM-DD 格式將其存儲在數據庫中,但出於某種奇怪的原因,它不斷引發上述錯誤並且沒有導致錯誤。 我花了幾個小時試圖調試它,但沒有運氣。

dob、doj、confirmation_date、exit_date 是模型和表單中的日期字段

我的型號:

class Employee(models.Model):
    class Meta:
        db_table = 'employees'

    

    # emp types
    TRAINEE = 1
    CONTRACTUAL = 2
    PERMANENT = 3

    EMP_TYPES = (
        (TRAINEE, 'Trainee'),
        (CONTRACTUAL, 'Contractual'),
        (PERMANENT, 'Permanent'),
    )

    # active status
    ACTIVE = 1
    RESINGED = 2
    TERMINATED = 3
    ABSCOND = 4
    LONG_LEAVE = 5
    TRN_TO_EMP = 6

    EMP_STATUS = (
        (ACTIVE, 'ACTIVE'),
        (RESINGED, 'RESINGED'),
        (TERMINATED, 'TERMINATED'),
        (ABSCOND, 'ABSCOND'),
        (LONG_LEAVE, 'Active'),
        (TRN_TO_EMP, 'TRAINEE TO EMPPLOYEE'),
    )

    # probation/confirm status
    PROBATION = 'p'
    CONFIRMED = 'c'

    # genders
    MALE = 'm'
    FEMALE = 'f'
    TRASNGENDER = 't'

    GENDERS = (
        (MALE, 'Male'),
        (FEMALE, 'Female'),
        (TRASNGENDER, 'Transgender')
    )

    user = models.ForeignKey(User, on_delete=models.CASCADE)

    emp_id = models.CharField(max_length=155)

    appointment_ref_id = models.CharField(max_length=255)

    personal_email = models.CharField(max_length=255)

    contact_number = models.CharField(max_length=50)

    emergency_contact_number = models.CharField(max_length=50)

    emergency_contact_relation = models.CharField(max_length=255)

    dob = models.DateField()

    blood_group = models.CharField(max_length=5)

    identity_mark = models.CharField(max_length=255, null=True)

    aadhar_no = models.CharField(max_length=16)
    pan_no = models.CharField(max_length=10)

    perm_address = models.TextField()  # permanent address
    com_address = models.TextField()  # communication address

    total_exp = models.DecimalField(max_digits=4, decimal_places=2)

    total_gt_exp = models.DecimalField(max_digits=4, decimal_places=2)

    doj = models.DateField()  # date of joining

    confirmation_date = models.DateField(null=True)

    exit_date = models.DateField(null=True)

    emp_type = models.SmallIntegerField(choices=EMP_TYPES)

    designation = models.ForeignKey(Designation, on_delete=models.DO_NOTHING)

    bank_name = models.CharField(max_length=255)

    bank_acc_no = models.CharField(max_length=50)

    prb_cnf_status = models.CharField(max_length=2,choices=(
        (PROBATION, 'Probation'),
        (CONFIRMED, 'Confirmed'),
    ), default=PROBATION)

    employment_status = models.SmallIntegerField(choices=EMP_STATUS, default=ACTIVE)

    location = models.ForeignKey(Location, on_delete=models.DO_NOTHING)

    pf_no = models.CharField(max_length=255)

    uan = models.CharField(max_length=255)

    remark = models.CharField(max_length=255,null=True)

    gender = models.CharField(max_length=1, choices=GENDERS)

    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return str(user.get_name())

    # def save(self, *args, **kwargs):
    #     if not self.id:
    #         # calulate the confirmation date
    #         self.confirmation_date = DateTimeHelper.add_months(self.doj, 6)
    #     super(Employee, self).save(*args, **kwargs)
MY FORM:
    class EmployeeForm(forms.ModelForm):
        class Meta:
            model = Employee
    
            fields = [
                'personal_email',
                'contact_number',
                'emergency_contact_number',
                'emergency_contact_relation',
                'dob',
                'blood_group',
                'identity_mark',
                'aadhar_no',
                'pan_no',
                'perm_address',
                'com_address',
                'total_exp',
                'total_gt_exp',
                'doj',
                'confirmation_date',
                'exit_date',
                'emp_type',
                'bank_name',
                'bank_acc_no',
                'prb_cnf_status',
                'employment_status',
                'pf_no',
                'uan',
                'designation',
                'location',
                'remark',
                'gender'
            ]
    
        personal_email = forms.CharField(max_length=255)
        contact_number = forms.CharField(max_length=10)
        emergency_contact_number = forms.CharField(max_length=55)
        emergency_contact_relation = forms.CharField(max_length=50)
        dob = forms.CharField(max_length=12)
        blood_group = forms.CharField(max_length=3)
        identity_mark = forms.CharField(max_length=100, required=False)
        aadhar_no = forms.CharField(max_length=12)
        pan_no = forms.CharField(max_length=10)
        perm_address = forms.CharField(max_length=255)
        com_address = forms.CharField(max_length=255)
        total_exp = forms.DecimalField(max_digits=3, decimal_places=2)
        total_gt_exp = forms.DecimalField(max_digits=3, decimal_places=2)
        doj = forms.CharField(max_length=12)
        confirmation_date = forms.CharField(max_length=10, required=False)
        exit_date = forms.CharField(max_length=10, required=False)
        emp_type = forms.ChoiceField(choices=Employee.EMP_TYPES)
        bank_name = forms.CharField(max_length=255)
        bank_acc_no = forms.CharField(max_length=255)
        prb_cnf_status = forms.CharField(max_length=2, required=False)
        employment_status = forms.ChoiceField(choices=Employee.EMP_STATUS, required=False)
        pf_no = forms.CharField(max_length=255)
        uan = forms.CharField(max_length=255)
        designation = forms.ModelChoiceField(queryset=Designation.objects.all())
        location = forms.ModelChoiceField(queryset=Location.objects.all())
        
        remark = forms.CharField(max_length=255, required=False)
        gender = forms.CharField(max_length=1)
    
        def clean_personal_email(self):
            email = self.cleaned_data['personal_email']
    
            if Employee.objects.filter(personal_email=email).exists():
                raise forms.ValidationError(
                    'Personal email of employee already exist!')
    
            return email
    
        def clean_contact_number(self):
            contact_number = self.cleaned_data['contact_number']
    
            if Employee.objects.filter(contact_number=contact_number).exists():
                raise forms.ValidationError(
                    'contact number of employee already exist!')
    
            return contact_number
    
        def clean_aadhar_no(self):
            aadhar_no = self.cleaned_data['aadhar_no']
            if Employee.objects.filter(aadhar_no=aadhar_no).exists():
                raise forms.ValidationError(
                    'Aadhar number of employee already exist!')
            return aadhar_no
    
        def clean_pan_no(self):
            pan_no = self.cleaned_data['pan_no']
            if Employee.objects.filter(pan_no=pan_no).exists():
                raise forms.ValidationError(
                    'PAN number of employee already exist!')
            return pan_no
    
        def clean_doj(self):
            doj = self.cleaned_data.get('doj', None)
            if doj:
                return DateTimeHelper.human_readable_to_sql(doj)
            
            raise forms.ValidationError("Invalid date format")
    
        def clean_dob(self):
            dob = self.cleaned_data.get('dob', None)
            if dob:
                return  DateTimeHelper.human_readable_to_sql(dob)
            raise forms.ValidationError("Invalid date format")


    
        def clean_confirmation_date(self):
            confirmation_date = self.cleaned_data.get('confirmation_date', None)
            if confirmation_date:
                return DateTimeHelper.human_readable_to_sql(confirmation_date)
            return confirmation_date
            
        def clean_exit_date(self):
            exit_date = self.cleaned_data.get('exit_date', None)
            if exit_date:
                return DateTimeHelper.human_readable_to_sql(exit_date)
            return exit_date

日期助手類:

class DateTimeHelper():

    @staticmethod
    def human_readable_to_sql(date):
        d = datetime.datetime.strptime(date, '%d/%m/%Y').date()
        return str(d)
        
        
DATE_INPUT_FORMATS = ("%d/%m/%Y",)    

添加日期輸入格式設置。 或者

forms.DateField(
    widget=forms.DateInput(format = '%d/%m/%Y',),
)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM