更新表单提交报错:'datetime.datetime'对象无'strip'属性
问题描述
我创建了一个更新表单,包含2个Time字段与2个DateTime字段。点击提交时,即使未修改任何内容,也会触发错误:'datetime.datetime' object has no attribute 'strip'。但使用同一模型创建新对象时无此问题。
模型代码
time_start=models.DateTimeField(blank=True,null=True) htime_start=models.TimeField(blank=True,null=True) time_end = models.DateTimeField(blank=True, null=True) htime_end=models.TimeField(blank=True,null=True) time_require=models.DateTimeField(blank=True,null=True) machine=models.ForeignKey(Machine,null=True, on_delete=models.SET_NULL, blank=True)
表单代码
class AssignTimeForProjects(forms.ModelForm): title = forms.CharField(disabled=True) owner=forms.CharField(disabled=True) time_require=forms.TimeField(disabled=True) class Meta: model = tb_order # fields='__all__' fields = ['title', 'owner', 'grade', 'quantity', 'time_require','htime_start','color', 'mould','time_start','time_end', 'htime_end' ,'machine'] def __init__(self, *args, **kwargs): super(AssignTimeForProjects, self).__init__(*args, **kwargs) self.fields["time_end"] = JalaliDateField(label=('تاریخ اتمام'), widget=(AdminJalaliDateWidget)) self.fields["time_start"] = JalaliDateField(label=('تاریخ شروع'), widget=(AdminJalaliDateWidget))
HTML代码片段
<label>{{ form.htime_start.label}}</label> {% render_field form.htime_start type="time" class+="form-control timepicker" autocomplete="off" %} <br> <label>{{ form.time_end.label}}</label> {% render_field form.time_end class+="form-control" autocomplete="off" %} <br> <label>{{ form.htime_end.label}}</label> {% render_field form.htime_end type="time" class+="form-control" autocomplete="off" %}
问题分析与解决方法
核心原因
- 字段类型替换错误:在表单的
__init__方法中,你直接用JalaliDateField替换了模型原本的DateTimeField。更新表单初始化时,会从数据库读取已有的datetime.datetime对象,但JalaliDateField内部逻辑是处理字符串输入,会调用strip()方法,而datetime对象没有这个属性,因此触发报错。新建对象时字段初始为空,不会触发这个类型不匹配问题。 time_require类型不匹配:模型中time_require是DateTimeField,但表单里定义成了TimeField,更新时也会存在类型转换冲突。
修复步骤
1. 保留字段类型,仅修改Widget
不要替换整个字段,而是修改原有DateTimeField的Widget为AdminJalaliDateWidget:
def __init__(self, *args, **kwargs): super(AssignTimeForProjects, self).__init__(*args, **kwargs) # 仅修改Widget,保留字段原有类型 self.fields["time_end"].widget = AdminJalaliDateWidget() self.fields["time_end"].label = 'تاریخ اتمام' self.fields["time_start"].widget = AdminJalaliDateWidget() self.fields["time_start"].label = 'تاریخ شروع'
2. 修正time_require字段类型
将表单中的time_require改为DateTimeField,与模型类型保持一致:
time_require=forms.DateTimeField(disabled=True)
验证
修改后重新测试更新流程:
- 表单能正确加载数据库中的
datetime值 - Jalali控件正常显示日期
- 提交时不会再出现
strip()相关错误
内容的提问来源于stack exchange,提问作者ashkan
相关产品推荐
相关产品推荐

