如何通过ModelForm为DateTimeRangeField赋值?遇必填校验错误
解决Django ModelForm中DateTimeRangeField的必填校验错误
问题出在表单数据的传递格式上——Django的DateTimeRangeField对应的表单字段并不直接支持接收psycopg2.extras.DateTimeTZRange实例,也不能直接用单个range键传递范围值,而是需要以下两种正确方式之一:
方式1:拆分传递上下限字段
Django会自动将DateTimeRangeField拆分为两个独立的表单输入项,名称格式为{字段名}_0(下限)和{字段名}_1(上限)。你可以直接传递这两个字段的字符串值:
# test.py 修改后 form = ReservationForm(data={ 'range_0': '2024-04-21 10:00', 'range_1': '2024-04-21 11:00' }) if form.is_valid(): form.save() else: print(form.errors.as_data())
方式2:传递PostgreSQL范围格式的字符串
如果你想通过单个range键传递,可以使用PostgreSQL原生的范围字符串格式(方括号表示闭区间,圆括号表示开区间):
# test.py 修改后 form = ReservationForm(data={ 'range': '[2024-04-21 10:00, 2024-04-21 11:00)' }) if form.is_valid(): form.save() else: print(form.errors.as_data())
原因说明
Django的表单字段在处理范围类型时,会将其解析为上下限两个值,而不是直接处理psycopg2的范围实例——表单数据本质是字符串类型,无法直接序列化Python对象。上述两种方式都能让表单正确解析范围值,通过校验并保存到数据库。
内容的提问来源于stack exchange,提问作者Dae
相关产品推荐
相关产品推荐

