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

更新表单提交报错:'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" %}

问题分析与解决方法

核心原因

  1. 字段类型替换错误:在表单的__init__方法中,你直接用JalaliDateField替换了模型原本的DateTimeField。更新表单初始化时,会从数据库读取已有的datetime.datetime对象,但JalaliDateField内部逻辑是处理字符串输入,会调用strip()方法,而datetime对象没有这个属性,因此触发报错。新建对象时字段初始为空,不会触发这个类型不匹配问题。
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 13:20:35