![](/img/trans.png)
[英]ValidationError: [“'' value has an invalid date format. It must be in YYYY-MM-DD format.”] in django
[英]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.