Django - 如何将模型的选择显示为复选框

时间:2012-06-02 02:30:23

标签: django django-models django-forms

我关注了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())

4 个答案:

答案 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 }内的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;。正如我所说,当然没有正常化。如果你的领域有一天会有很多价值,事情可能会变得丑陋。