カスタムフィールドを使用せずに複数選択を本当に使用したい場合、これは私が同様のシナリオで行ったことです。警告:データベースに保存されている値は、通常の形式に違反しています。しかし、それは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」になります。私が言ったように、確かに正規化されていません。そして、あなたのフィールドがいつか多くの値を持つことができるならば、物事は実際に醜くなるかもしれません。