gpt4 book ai didi

django - Django表单中,自定义SelectField和SelectMultipleField

转载 作者:行者123 更新时间:2023-12-02 11:34:11 24 4
gpt4 key购买 nike

我现在每天都使用 Django,已经三个月了,它真的很棒。快速 Web 应用程序开发。

我还有一件事无法完全按照自己的意愿去做。它是 SelectField 和 SelectMultiple 字段。

我希望能够将一些参数放入 Select 的选项中。

我终于成功使用 optgroup 了:

class EquipmentField(forms.ModelChoiceField):
def __init__(self, queryset, **kwargs):
super(forms.ModelChoiceField, self).__init__(**kwargs)
self.queryset = queryset
self.to_field_name=None

group = None
list = []
self.choices = []

for equipment in queryset:
if not group:
group = equipment.type

if group != equipment.type:
self.choices.append((group.name, list))
group = equipment.type
list = []
else:
list.append((equipment.id, equipment.name))

但是对于另一个 ModelForm,我必须使用模型的颜色属性更改每个选项的背景颜色。

你知道我该怎么做吗?

谢谢。

最佳答案

您需要做的是更改由小部件控制的输出。默认是选择小部件,因此您可以对其进行子类化。它看起来像这样:

class Select(Widget):
def __init__(self, attrs=None, choices=()):
super(Select, self).__init__(attrs)
# choices can be any iterable, but we may need to render this widget
# multiple times. Thus, collapse it into a list so it can be consumed
# more than once.
self.choices = list(choices)

def render(self, name, value, attrs=None, choices=()):
if value is None: value = ''
final_attrs = self.build_attrs(attrs, name=name)
output = [u'<select%s>' % flatatt(final_attrs)]
options = self.render_options(choices, [value])
if options:
output.append(options)
output.append('</select>')
return mark_safe(u'\n'.join(output))

def render_options(self, choices, selected_choices):
def render_option(option_value, option_label):
option_value = force_unicode(option_value)
selected_html = (option_value in selected_choices) and u' selected="selected"' or ''
return u'<option value="%s"%s>%s</option>' % (
escape(option_value), selected_html,
conditional_escape(force_unicode(option_label)))
# Normalize to strings.
selected_choices = set([force_unicode(v) for v in selected_choices])
output = []
for option_value, option_label in chain(self.choices, choices):
if isinstance(option_label, (list, tuple)):
output.append(u'<optgroup label="%s">' % escape(force_unicode(option_value)))
for option in option_label:
output.append(render_option(*option))
output.append(u'</optgroup>')
else:
output.append(render_option(option_value, option_label))
return u'\n'.join(output)

这是很多代码。但您需要做的是使用更改的渲染方法来制作您自己的小部件。渲染方法决定了创建的 html。在本例中,您需要更改的是 render_options 方法。在这里,您可以进行一些检查以确定何时添加可以设置样式的类。

另一件事,在上面的代码中,您看起来并没有附加最后的组选择。此外,您可能希望将 order_by() 添加到查询集中,因为您需要按类型对其进行排序。您可以在 init 方法中执行此操作,因此在使用表单字段时不必重新执行此操作。

关于django - Django表单中,自定义SelectField和SelectMultipleField,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1878369/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com