Django使用AdminSplitDateTime组件报'list'无strip属性错误求助
解决Django中使用AdminSplitDateTime/SplitDateTimeWidget时的AttributeError问题
嘿,我碰到过一模一样的问题!你这是因为字段类型和widget不匹配导致的——AdminSplitDateTime(包括SplitDateTimeWidget)这类拆分式组件,提交给后端的是一个包含日期和时间的列表(比如['2024-05-20', '14:30']),但默认的DateTimeField期望接收单个字符串格式的日期时间,它会尝试调用strip()方法处理输入,而列表根本没有这个方法,所以就抛出了那个AttributeError。
最简单的解决方案:换成SplitDateTimeField
Django专门提供了SplitDateTimeField来配合拆分式widget使用,它能正确处理列表格式的输入。只需要修改你的Form类,把DateTimeField替换成SplitDateTimeField就行:
修改后的Form类代码
from django.contrib.admin import widgets as admin_widgets from django.forms import SplitDateTimeField # 别忘了导入这个字段 class EventCreateForm(ModelForm): # 把原来的DateTimeField换成SplitDateTimeField,对应AdminSplitDateTime widget event_start = SplitDateTimeField(widget=admin_widgets.AdminSplitDateTime()) event_end = SplitDateTimeField(widget=admin_widgets.AdminSplitDateTime()) def __init__(self, *args, **kwargs): self.user = kwargs.pop('user') super().__init__(*args, **kwargs) self.fields['hasta'].queryset = Hasta.objects.filter(doktor_id=self.user.id) class Meta: model = Event fields = [ 'event_start', 'event_end', 'notes', 'hasta', ] labels = { 'event_start': _('Randevu Başlangıç Tarihi'), 'event_end': _('Randevu Bitiş Tarihi'), 'notes': _('Notlar') }
为什么这样能行?
SplitDateTimeField内部已经做了适配:它会自动把提交过来的日期和时间列表合并成一个有效的datetime对象,而不是像DateTimeField那样傻乎乎地对列表调用字符串方法。这样既保留了AdminSplitDateTime的友好交互,又能让表单正常提交。
额外小提示
如果需要自定义日期或时间的显示/输入格式,可以给SplitDateTimeField加上date_format和time_format参数,比如:
event_start = SplitDateTimeField( widget=admin_widgets.AdminSplitDateTime(), date_format='%Y-%m-%d', # 自定义日期格式 time_format='%H:%M' # 自定义时间格式 )
内容的提问来源于stack exchange,提问作者Calavera
相关产品推荐
相关产品推荐

