Python Django添加属性以选择多个标记

Python Django添加属性以选择多个标记,python,django,Python,Django,关于在django表单字段中向标记添加属性,有一个很好的解释。但这只是一个选择。我想对SelectMultiple执行相同的操作 创建模型表单字段employees时,我尝试了以下子类Select和SelectMultiple并引用MySelectMultiple: 但是呈现的表单仍然显示为Select小部件,而不是SelectMultiple小部件 我可以向MySelectMultiple提供attrs={'multiple':'multiple'},使表单字段呈现为一个multiple-se

关于在django表单字段中向标记添加属性,有一个很好的解释。但这只是一个选择。我想对SelectMultiple执行相同的操作

创建模型表单字段employees时,我尝试了以下子类Select和SelectMultiple并引用MySelectMultiple:

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

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


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

好的,通过使用:

class MySelectMultiple(MySelect):
    def __init__(self, *args, **kwargs):
        super(MySelectMultiple, self).__init__(*args, **kwargs) 
我仍然在使用django原生Select,但只是将其称为MySelectMultiple。我需要导入SelectMultiple的其余部分

因此,不是:

class MySelectMultiple(MySelect):
    def __init__(self, *args, **kwargs):
        super(MySelectMultiple, self).__init__(*args, **kwargs) 
该类需要完整复制/粘贴SelectMultiple的本机django代码:


您的select multiple应继承自SelectMultiple,而不是select:


看起来您的uuu init uuuu方法不是必需的,因为它只调用super。

选择Multiple inherits from Select,您只需要覆盖create_option方法即可获得相同的结果:

class MySelectMultiple(forms.SelectMultiple):
    def create_option(self, name, value, *args, **kwargs):
        option = super().create_option(name, value, *args, **kwargs)
        if value:
            instance = self.choices.queryset.get(pk=value)  # get instance
            option['attrs']['custom_attr'] = instance.field_name  # set option attribute
        return option


员工人数众多吗field@Thameem对但请参见下面的答案。默认情况下,当您调用form.save时,多个字段将呈现为mutlipleselct字段。它将自动保存这些值。那你为什么要用这个是的,很好。但我这样做是为了给标签添加额外的属性——默认的SelectMultiple小部件不提供这些属性。有一个通用的解决方案,适用于Django 2。+并允许在选项中添加标题和其他内容,请参阅让我试试。谢谢。你的答案和我的答案一样,但我的答案是干的,所以我选择你的答案。非常感谢。
class MySelectMultiple(MySelect):
    allow_multiple_selected = True

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


    def render(self, name, value, attrs=None, choices=()):
        if value is None:
            value = []
        final_attrs = self.build_attrs(attrs, name=name)
        output = [format_html('<select multiple="multiple"{0}>', forms.utils.flatatt(final_attrs))]
        options = self.render_options(choices, value)
        if options:
            output.append(options)
        output.append('</select>')
        return mark_safe('\n'.join(output))

    def value_from_datadict(self, data, files, name):
        if isinstance(data, (MultiValueDict, MergeDict)):
            return data.getlist(name)
        return data.get(name, None)
class MySelectMultiple(SelectMultiple):
    def render_option(self, selected_choices, option_value, option_label):
        # original forms.Select code #
        return u'<option custom_attribute="foo">...</option>'
class MySelectMultiple(forms.SelectMultiple):
    def create_option(self, name, value, *args, **kwargs):
        option = super().create_option(name, value, *args, **kwargs)
        if value:
            instance = self.choices.queryset.get(pk=value)  # get instance
            option['attrs']['custom_attr'] = instance.field_name  # set option attribute
        return option