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