【问题标题】:Choices lost when overriding Django Select with RadioSelect使用 RadioSelect 覆盖 Django Select 时选择丢失
【发布时间】:2015-11-27 10:26:27
【问题描述】:

鉴于下面的 django 模型,是否可以自动将字段的子集更新为 RadioSelect 而不是默认的 Select

class ExampleModel(models.Model):
    field1_radios = models.CharField(max_length=1, choices=DEFAULT_CHOICES)
    field2_radios = models.CharField(max_length=1, choices=DEFAULT_CHOICES)
    field3_radios = models.CharField(max_length=1, choices=DEFAULT_CHOICES)
    field4_radios = models.CharField(max_length=1, choices=DEFAULT_CHOICES)
    field5 = models.CharField(max_length=50)
    ...

我可以通过以下方式手动实现:

class ExampleForm(forms.ModelForm):
    class Meta:
        model = ExampleModel
        widgets = {
            'field1_radios': forms.RadioSelect(),
            'field2_radios': forms.RadioSelect(),
            'field3_radios': forms.RadioSelect(),
            'field4_radios': forms.RadioSelect()}

当我尝试自动创建小部件时,选择会丢失(并且未呈现单选按钮):

def custom_callback(f, *args, **kwargs):
    if f.name.endswith('_radios'):
        formfield = f.formfield()
        formfield.widget = forms.RadioSelect()
        return formfield
    else:
        return f.formfield()

class ExampleForm(forms.ModelForm):
    formfield_callback = custom_callback
    class Meta:
        model = ExampleModel

【问题讨论】:

    标签: django


    【解决方案1】:

    啊,看来我错过了重新指定原始选择的最后一步,这不是自动完成的:

    def custom_callback(f, *args, **kwargs):
        if f.name.endswith('_radios'):
            formfield = f.formfield()
            formfield.widget = forms.RadioSelect(choices=formfield.choices)
            return formfield
        else:
            return f.formfield()
    

    【讨论】:

    【解决方案2】:

    我没有看到formfield_callback 经常被使用,而且我认为它没有被记录在案。

    另一种方法是覆盖formfield_for_choice_field

    class MyModelAdmin(admin.ModelAdmin):
        ...
    
        def formfield_for_choice_field(self, db_field, request, **kwargs):
            """Use a radio select instead of a select box"""
            kwargs['widget'] = forms.RadioSelect
            if 'choices' not in kwargs:
                # this was required to prevent displaying the empty label ---------
                kwargs['choices'] = db_field.get_choices(include_blank=False)
            return super(MyModelAdmin, self).formfield_for_choice_field(db_field, request, **kwargs)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-24
      • 2012-01-31
      • 1970-01-01
      • 2015-08-16
      • 2011-07-11
      • 2021-11-27
      • 1970-01-01
      • 2018-02-08
      相关资源
      最近更新 更多