如果您真的想使用多选,而不使用任何自定义字段,这就是我在类似场景中所做的。警告:存储在数据库中的值违反了正常形式。但由于它应该是 2-3 值字符串(增长的机会非常渺茫,我更喜欢这种快速破解)
我所做的是,该模型只使用了一个 CharField,而不关心它将用于什么。另一方面,ModelForm 处理多项选择逻辑。
在我的“models.py”中
class Notification(models.Model):
platforms = models.CharField(max_length=30, blank=False)
在“forms.py”中
class NotificationForm(forms.ModelForm):
class Meta(object):
model = models.Notification
platforms = forms.MultipleChoiceField(initial='android', choices=(('ios', 'iOS'), ('android', 'Android')), widget=forms.CheckboxSelectMultiple)
def __init__(self, *args, **kwargs):
instance = kwargs['instance']
# Intercepting the instance kw arg, and turning it into a list from a csv string.
if instance is not None:
instance.platforms = instance.platforms.split(",")
kwargs['instance'] = instance
super(NotificationForm, self).__init__(*args, **kwargs)
# Do other stuff
def clean(self):
cleaned_data = super(NotificationForm, self).clean()
platforms = cleaned_data['platforms']
# Convert the list back into a csv string before saving
cleaned_data['platforms'] = ",".join(platforms)
# Do other validations
return cleaned_data
如果选中两个复选框,则存储在数据库列中的数据将是字符串“ios,android”。否则,它将是“ios”、“android”。正如我所说,当然没有标准化。如果有一天你的领域可以有很多值,事情实际上可能会变得丑陋。