Use CharField for date inputs to fix date saving issue

This commit is contained in:
xiaji
2026-04-30 17:01:11 +08:00
parent b8348350fa
commit 95b91aa6c2

View File

@@ -4,6 +4,12 @@ from .models import UPSHost, Battery
class UPSHostForm(forms.ModelForm): class UPSHostForm(forms.ModelForm):
last_maintenance_date = forms.CharField(
required=False,
label='上次维保时间',
widget=forms.TextInput(attrs={'class': 'form-control datepicker', 'placeholder': '选择日期'}),
)
class Meta: class Meta:
model = UPSHost model = UPSHost
fields = ['brand', 'model', 'ip_address', 'quantity', 'location', 'last_maintenance_date', 'contact'] fields = ['brand', 'model', 'ip_address', 'quantity', 'location', 'last_maintenance_date', 'contact']
@@ -13,7 +19,6 @@ class UPSHostForm(forms.ModelForm):
'ip_address': 'IP地址', 'ip_address': 'IP地址',
'quantity': '数量', 'quantity': '数量',
'location': '存放位置', 'location': '存放位置',
'last_maintenance_date': '上次维保时间',
'contact': '联系人', 'contact': '联系人',
} }
widgets = { widgets = {
@@ -22,12 +27,37 @@ class UPSHostForm(forms.ModelForm):
'ip_address': forms.TextInput(attrs={'class': 'form-control'}), 'ip_address': forms.TextInput(attrs={'class': 'form-control'}),
'quantity': forms.NumberInput(attrs={'class': 'form-control', 'min': '1'}), 'quantity': forms.NumberInput(attrs={'class': 'form-control', 'min': '1'}),
'location': forms.TextInput(attrs={'class': 'form-control'}), 'location': forms.TextInput(attrs={'class': 'form-control'}),
'last_maintenance_date': forms.DateInput(attrs={'class': 'form-control datepicker', 'type': 'text', 'placeholder': 'YYYY-MM-DD'}),
'contact': forms.Select(attrs={'class': 'form-control'}), 'contact': forms.Select(attrs={'class': 'form-control'}),
} }
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
if self.instance and self.instance.pk and self.instance.last_maintenance_date:
self.fields['last_maintenance_date'].initial = self.instance.last_maintenance_date.strftime('%Y-%m-%d')
def clean_last_maintenance_date(self):
date_str = self.cleaned_data.get('last_maintenance_date')
if date_str:
from datetime import datetime
try:
return datetime.strptime(date_str, '%Y-%m-%d').date()
except ValueError:
return date_str
return None
class BatteryForm(forms.ModelForm): class BatteryForm(forms.ModelForm):
install_date = forms.CharField(
required=False,
label='安装日期',
widget=forms.TextInput(attrs={'class': 'form-control form-control-sm datepicker-battery', 'placeholder': '选择日期'}),
)
last_maintenance_date = forms.CharField(
required=False,
label='上次维保时间',
widget=forms.TextInput(attrs={'class': 'form-control form-control-sm datepicker-battery', 'placeholder': '选择日期'}),
)
class Meta: class Meta:
model = Battery model = Battery
fields = ['brand', 'model', 'weight', 'quantity', 'location', 'install_date', 'last_maintenance_date'] fields = ['brand', 'model', 'weight', 'quantity', 'location', 'install_date', 'last_maintenance_date']
@@ -37,8 +67,6 @@ class BatteryForm(forms.ModelForm):
'weight': '重量(kg)', 'weight': '重量(kg)',
'quantity': '数量', 'quantity': '数量',
'location': '存放位置', 'location': '存放位置',
'install_date': '安装日期',
'last_maintenance_date': '上次维保时间',
} }
widgets = { widgets = {
'brand': forms.TextInput(attrs={'class': 'form-control form-control-sm'}), 'brand': forms.TextInput(attrs={'class': 'form-control form-control-sm'}),
@@ -46,9 +74,35 @@ class BatteryForm(forms.ModelForm):
'weight': forms.NumberInput(attrs={'class': 'form-control form-control-sm', 'step': '0.1'}), 'weight': forms.NumberInput(attrs={'class': 'form-control form-control-sm', 'step': '0.1'}),
'quantity': forms.NumberInput(attrs={'class': 'form-control form-control-sm', 'min': '1'}), 'quantity': forms.NumberInput(attrs={'class': 'form-control form-control-sm', 'min': '1'}),
'location': forms.TextInput(attrs={'class': 'form-control form-control-sm'}), 'location': forms.TextInput(attrs={'class': 'form-control form-control-sm'}),
'install_date': forms.DateInput(attrs={'class': 'form-control form-control-sm datepicker-battery', 'type': 'text', 'placeholder': 'YYYY-MM-DD'}),
'last_maintenance_date': forms.DateInput(attrs={'class': 'form-control form-control-sm datepicker-battery', 'type': 'text', 'placeholder': 'YYYY-MM-DD'}),
} }
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
if self.instance and self.instance.pk:
if self.instance.install_date:
self.fields['install_date'].initial = self.instance.install_date.strftime('%Y-%m-%d')
if self.instance.last_maintenance_date:
self.fields['last_maintenance_date'].initial = self.instance.last_maintenance_date.strftime('%Y-%m-%d')
def clean_install_date(self):
date_str = self.cleaned_data.get('install_date')
if date_str:
from datetime import datetime
try:
return datetime.strptime(date_str, '%Y-%m-%d').date()
except ValueError:
return date_str
return None
def clean_last_maintenance_date(self):
date_str = self.cleaned_data.get('last_maintenance_date')
if date_str:
from datetime import datetime
try:
return datetime.strptime(date_str, '%Y-%m-%d').date()
except ValueError:
return date_str
return None
BatteryFormSet = inlineformset_factory( BatteryFormSet = inlineformset_factory(