2

我遵循了这一点,但我仍然无法在我的表单上将 CHOICES 显示为复选框。

模型.py

class Car(models.Model):
    TYPE_CHOICES = (
       ('s', 'small'),
       ('m', 'medium'),
       ('b', 'big'),
     )
     type = models.CharField(max_length=1, choices=TYPE_CHOICES)

表格.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

4 回答 4

4

您需要使用forms.RadioSelect()而不是forms.CheckboxSelectMultiple()因为它的单值。

要覆盖 ModelForm的小部件,请查看文档

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
于 2012-06-02T06:51:10.457 回答
1

Route.SCENERY_CHOICES没有使用Car.TYPE_CHOICES

于 2012-06-02T03:41:29.610 回答
0

如果您真的想使用多选,而不使用任何自定义字段,这就是我在类似场景中所做的。警告:存储在数据库中的值违反了正常形式。但由于它应该是 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”。正如我所说,当然没有标准化。如果有一天你的领域可以有很多值,事情实际上可能会变得丑陋。

于 2018-04-23T20:55:22.250 回答
0

这就是forms.forms

class AddCarForm(forms.Form):
    type = forms.MultipleChoiceField(required=False,
    widget=forms.CheckboxSelectMultiple, choices=TYPE_CHOICES)

这就是forms.ModelForm

class AddCar(forms.ModelForm):
    type = forms.MultipleChoiceField(required=False,
    widget=forms.CheckboxSelectMultiple, choices=TYPE_CHOICES)

    class Meta:
        model = Car

然后在模板中使用它非常重要

{{ form.type }} 

即不要type像html一样调用<input type="checkbox" name="type" id="id_type">

于 2016-02-07T23:08:54.173 回答