如何为Django模型的MultiSelectField设置默认值?
解决Django MultiSelectField设置默认值的问题
嘿,这个报错的原因很明确——你搞错元组的索引逻辑啦!先看你的DAYS选项:每个选项都是长度为2的元组,第一个元素(索引0)是存在数据库里的实际值,第二个元素(索引1)是后台显示的友好文本。你写的DAYS[7][7],先不说DAYS[7]本身只有两个元素、索引最大是1,根本到不了7,这肯定会触发“元组索引超出范围”的错误呀。
下面给你两种正确设置默认值的方式:
方式一:直接指定选项的实际值(推荐)
这种方式不依赖选项的顺序,哪怕以后你调整DAYS的排序,默认值也不会出错:
from django.db import models from multiselectfield import MultiSelectField class Shop(models.Model): DAYS = ( ('sunday', 'Sunday'), ('monday', 'Monday'), ('tuesday', 'Tuesday'), ('wednesday', 'Wednesday'), ('thursday', 'Thursday'), ('friday', 'Friday'), ('saturday', 'Saturday'), ('Not any day', 'None'), ) # 默认选择"None"对应的选项,注意是元组格式 closingDay = MultiSelectField(choices=DAYS, default=('Not any day',))
方式二:通过索引获取选项值
如果你想用索引的方式,要记得取元组的第一个元素(实际存储值),并且包装成元组:
# DAYS[7]是('Not any day', 'None')这个元组,[0]取到实际存储值 closingDay = MultiSelectField(choices=DAYS, default=(DAYS[7][0],))
重点提醒:
MultiSelectField的默认值必须是可迭代对象(元组或列表),哪怕你只需要默认选中一个选项,也不能直接写字符串'Not any day',必须用('Not any day',)或者['Not any day']这种格式,否则会导致字段验证失败。
内容的提问来源于stack exchange,提问作者Divakar Yadav
相关产品推荐
相关产品推荐

