here关于在django表单字段内向<option>标记添加属性有很好的解释。但这仅适用于Select widget。我想对SelectMultiple widget做同样的事情。

我尝试了以下操作(创建Select表单字段SelectMultiple时,子类MySelectMultipleModel并引用employees):

class MySelect(forms.Select):

    def __init__(self, *args, **kwargs):
            super(MySelect, self).__init__(*args, **kwargs)

    def render_option(self, selected_choices, option_value, option_label):
        # original forms.Select code #
        return u'<option custom_attribute="foo">...</option>'

class MySelectMultiple(MySelect):
    def __init__(self, *args, **kwargs):
        super(MySelectMultiple, self).__init__(*args, **kwargs)

employees = forms.ModelMultipleChoiceField(
                    widget=MySelectMultiple(attrs={}),
                    queryset=Employee.objects.all(),
                )


但是呈现的表单仍显示为Select小部件,而不是SelectMultiple小部件。

我可以提供attrs={'multiple':'multiple'}MySelectMultiple以使表单字段呈现为多选小部件-但是保存表单时,仅保存一个值(不保存多个值)!

如何将表单呈现为多选字段并保存所有选定值?谢谢。

最佳答案

您选择的倍数应该继承自SelectMultiple而不是Select

class MySelectMultiple(SelectMultiple):
    def render_option(self, selected_choices, option_value, option_label):
        # original forms.Select code #
        return u'<option custom_attribute="foo">...</option>'


看起来您的__init__方法不是必需的,因为它只是调用super()

关于python - Django将属性添加到SelectMultiple <option>标签,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43524214/

10-13 03:36