我关注了this,但我仍然无法在表单上显示CHOICES作为复选框。
models.py
class Car(models.Model):
TYPE_CHOICES = (
('s', 'small'),
('m', 'medium'),
('b', 'big'),
)
type = models.CharField(max_length=1, choices=TYPE_CHOICES)
forms.py
from django import forms
from django.forms.widgets import CheckboxSelectMultiple
from cars.models import Car
class AddCar(forms.ModelForm):
class Meta:
model = Car
type = forms.MultipleChoiceField(choices=Car.TYPE_CHOICES, widget=forms.CheckboxSelectMultiple())
答案 0 :(得分:3)
您需要使用forms.RadioSelect()
代替forms.CheckboxSelectMultiple()
,因为它的单值。
要覆盖ModelForm的小部件,check the doc
class AddCar(forms.ModelForm):
class Meta:
model = Car
widgets = {'type': forms.RadioSelect}
或者在您的问题中,type
行应位于class Meta
1>}内的AddCar
行之上
class AddCar(forms.ModelForm):
type = forms.ChoiceField(choices=Car.SCENERY_CHOICES, widget=forms.RadioSelect)
class Meta:
model = Car
答案 1 :(得分:1)
您使用的是Route.SCENERY_CHOICES
而不是Car.TYPE_CHOICES
答案 2 :(得分:0)
表格。表格
class AddCarForm(forms.Form):
type = forms.MultipleChoiceField(required=False,
widget=forms.CheckboxSelectMultiple, choices=TYPE_CHOICES)
表单的形式.ModelForm
class AddCar(forms.ModelForm):
type = forms.MultipleChoiceField(required=False,
widget=forms.CheckboxSelectMultiple, choices=TYPE_CHOICES)
class Meta:
model = Car
然后在模板中使用这个非常重要
{{ form.type }}
即不要像type
<input type="checkbox" name="type" id="id_type">
称为html
答案 3 :(得分:0)
如果你真的想使用多个选择,而不使用任何自定义字段,这就是我在类似场景中所做的。 警告:存储在数据库中的值违反了正常格式。但是因为它应该是2-3个值的字符串(增长的机会很小,我更喜欢这个快速的黑客)
我所做的是,该模型仅使用CharField,而不会打扰它将被用于什么。另一方面,ModelForm处理多选逻辑。
在我的&#34; models.py&#34;
中class Notification(models.Model):
platforms = models.CharField(max_length=30, blank=False)
在&#34; forms.py&#34;
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
存储在数据库列中的数据将是一个字符串&#34; ios,android&#34;如果两个复选框都被选中。否则,它将是&#39; ios&#39; android&#39;。正如我所说,当然没有正常化。如果你的领域有一天会有很多价值,事情可能会变得丑陋。