【发布时间】:2017-09-17 08:44:59
【问题描述】:
here 在 django 表单字段中向 <option> 标签添加属性有很好的解释。但这仅适用于Select widget。我想为SelectMultiple widget 做同样的事情。
我尝试了以下方法(子类Select 和SelectMultiple 并在创建Model 表单字段employees 时引用MySelectMultiple):
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 以使表单字段呈现为多选小部件 - 但是当保存表单时,只保存一个值(而不是多个值)!
如何将表单呈现为多选字段并保存所有选定的值?谢谢。
【问题讨论】:
-
员工字段是多对多字段
-
@Thameem 是的。但请参阅下面的答案。
-
默认情况下,多对多字段将呈现为 mutlipleselct 字段,并且当您调用 form.save() 时。它会自动保存这些值。那你为什么用这个
-
是的,很好。但我这样做是为了向
<option>标签添加额外的属性——默认的SelectMultiple小部件不提供这些属性。 -
有一个适用于 Django 2.+ 的通用解决方案,并允许在选项中添加标题和其他内容,请参阅stackoverflow.com/a/56097149/1788851