【问题标题】:Django - Show BooleanField in a formset as one group of radio buttonsDjango - 在表单集中将 BooleanField 显示为一组单选按钮
【发布时间】:2012-04-03 07:07:48
【问题描述】:

我有以下型号:

class Profile(models.Model):
    verified = models.BooleanField(default=False)

    def primary_phone(self):
        return self.phone_set.get(primary=True)

class Phone(models.Model):
    profile = models.ForeignKey(Profile)
    type = models.CharField(choices=PHONE_TYPES, max_length=16)
    number = models.CharField(max_length=32)
    primary = models.BooleanField(default=False)

    def save(self, force_insert=False, force_update=False, using=None):
        if self.primary:
            # clear the primary attribute of other phones of the related profile
            self.profile.phone_set.update(primary=False)
        self.save(force_insert, force_update, using)

我在 ModelForm 中使用 Phone 作为表单集。我想要做的是将Phone.primary 显示为Phone 的每个实例旁边的单选按钮。如果我将主要作为RadioSelect 小部件:

class PhoneForm(ModelForm):
    primary = forms.BooleanField(widget=forms.RadioSelect( choices=((0, 'False'), (1, 'True')) ))

    class Meta:
        from accounts.models import Phone
        model = Phone
        fields = ('primary', 'type', 'number', )

它将显示两个单选按钮,它们将在每个实例旁边分组在一起。相反,我正在寻找一种方法,在每个实例旁边只显示一个单选按钮(应该为该实例设置primary=True),并将所有单选按钮组合在一起,以便只能选择其中一个.

我也在寻找一种干净的方法,我可以手动完成上述大部分操作 - 在我的脑海中 - 但我有兴趣看看是否有更好的方法,一种 django 风格方式。

有人有想法吗?

【问题讨论】:

    标签: django django-models django-widget django-forms


    【解决方案1】:

    好的,你有两个困境。首先,您需要通过赋予相同的 HTML 名称属性来对来自不同表单集中的所有单选选项进行分组。我通过下面的 add_prefix 覆盖做到了这一点。

    然后,您必须确保您的帖子数据中的“主要”字段返回有意义的内容,您可以从中确定选择了哪个手机(您可以在 POST 数据 b/c 中只有一个“名称”值仅从组中选择一个单选按钮)。通过分配正确的前缀值(这需要在 _init_ 下完成,以便您可以访问 self 实例),您将能够关联“主” value 及其其余表单数据(通过自定义保存方法)。

    我用以下内容测试了一个表单集,它吐出了正确的 html。所以试试这个:

    class PhoneForm(ModelForm):
        def __init__ (self, *args, **kwargs)
            super(PerstransForm, self).__init__(*args, **kwargs)
            self.fields['primary'] = forms.BooleanField( widget = forms.RadioSelect(choices=((self.prefix, 'This is my Primary Phone'),))
    
        #enter your fields except primary as you had before.
        def add_prefix(self, field):
            if field == 'primary': return field
            else: return self.prefix and ('%s-%s' % (self.prefix, field)) or field
    

    【讨论】:

      猜你喜欢
      • 2018-07-14
      • 2010-10-25
      • 2015-08-26
      • 1970-01-01
      • 2013-06-23
      • 1970-01-01
      • 2021-06-10
      • 1970-01-01
      • 2013-02-25
      相关资源
      最近更新 更多