You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:45:39