Django表单中,自定义SelectField和SelectMultipleField

2023-11-27

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

我还有一件事不能完全按照自己的意愿去做。 它是选择字段和选择多个字段。

我希望能够将一些参数添加到 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 方法中执行此操作,因此在使用表单字段时不必重新执行此操作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Django表单中,自定义SelectField和SelectMultipleField 的相关文章

随机推荐

  • python 字典更新差异

    python 是否有任何内置功能来通知字典更新时哪些字典元素发生了变化 例如 我正在寻找这样的功能 gt gt gt a a hamburger b fries c coke gt gt gt b b fries c pepsi d ice
  • 禁用硬件键 Android ROM

    我想禁用我的自定义 AOSP ROM 中的主页 菜单和后退按钮 我在互联网上搜索过 发现在 out target product generic system usr keylayout 中找到的按键布局文件成功构建后 我可以禁用按钮 我正
  • Eclipse:添加 javadoc

    我通常如何在 eclipse 中为不同的包添加 javadoc 举个例子 我想在 eclipse 中添加 hibernate 的所有 javadoc 但我不知道如何 我读过这篇文章如何在 Eclipse 中添加 hibernate java
  • 按字典顺序对 2d numpy 数组进行排序

    我有一个包含数百列的大型二维数组 我想按字典顺序对其进行排序 即按第一列 然后按第二列 依此类推 直到最后一列 我想这应该很容易做到 但我还没有找到一种快速的方法来做到这一点 这是什么numpy lexsort是的 但是界面很尴尬 向其传递
  • 查找数组中三个多数元素的算法

    假设一个未排序的数组中有三个元素 所有元素出现的次数都超过元素总数的四分之一 找到这些元素最有效的方法是什么 对于这个问题的非在线和在线版本 谢谢你 Edit 我指的非在线版本是 这个数组是完整指定的 在线版本意味着数组元素一次出现一个 我
  • libuv 对 uv_loop_new 的未定义引用

    编译后 我尝试运行libuv示例程序 include
  • 在 Heroku 上禁用 irb 自动完成

    后续行动禁用 irb 自动完成 我想在 Heroku 上禁用 IRB 例如有一个 irbrc with IRB conf USE AUTOCOMPLETE false 在我的 heroku dyno server 的主目录中 我该怎么做 如
  • python3用单反斜杠替换双反斜杠[重复]

    这个问题在这里已经有答案了 我需要更换 with 在python3中是一个复杂的字符串 我知道这个问题已经被问过好几次了 但大多数时候都是针对简单的字符串 因此没有一个 接受的 答案真正适用于复杂的字符串 这也是不同的 from this
  • 如何通过在运行时选择单元测试来运行 CPPUnit 中的单元测试子集?

    我使用 CppUnit 作为单元测试框架 是否可以选择测试用例的子集在运行时执行 CppUnit 中是否提供了过滤选项来适应这种情况 您可能在 main 中调用的 TestRunner run 方法实际上具有可选参数 run std str
  • Javascript正则表达式-exec无限循环

    我正在尝试使用正则表达式获取链接文本 可能有几个链接可能与该模式匹配 我想获得最远的一个直到第四个 这是我的JS代码 var level 1 while match a href a
  • excel中24小时以上的时间表示

    有没有办法在 Excel 中表示时间值 其中小时数可以为 24 及以上 例如 第二天凌晨 1 点的时间为 25 00 00 公共交通调度中的常见表示 它不能只是纯文本 因为我希望能够对它们执行计算 例如平均值 标准差 或绘制图表 情况已经是
  • 为什么这个主要测试这么慢?

    这段代码取自 Haskell Road to Logic Math andProgramming 一书 它实现了埃拉托斯特尼筛法并解决了欧拉计划问题 10 sieve Integer gt Integer sieve 0 xs sieve
  • 矢量作为 C++ 中的数据成员

    在 C 中 如何将 101 个元素向量作为数据成员包含在我的类中 我正在执行以下操作 但它似乎不起作用 private std vector lt bool gt integers 101 我已经包含了矢量标头 提前致谢 class myC
  • 将数组分割成块

    假设我有一个如下所示的 Javascript 数组 Element 1 Element 2 Element 3 with close to a hundred elements 什么方法适合将数组分成许多更小的数组 比如说最多 10 个元素
  • JavaScript/jQuery VIN 验证器

    有人创建过 VIN 验证器吗 我正在尝试创建一个文本框 用户将在其中输入车辆识别号 然后 JS jQuery 将验证其是否正确 以防用户输入错误的数字 我对 JS jQuery 很陌生 并且找到了一些示例 但当然无法让它们正常工作 任何有任
  • string::c_str 查询

    调用 string c str 返回的指针指向哪里 在下面的代码片段中 我以为我会给出分段错误 但它给了我正确的输出 如果 string c str 返回的指针指向字符串对象内的内部位置 那么当函数返回并调用对象析构函数时 我应该获得无效的
  • Magento resize() 图像质量:脏白色背景

    我有一位客户对其产品缩略图在 Magento 上的呈现方式非常不满意 这种狡猾的外观在两个方面很明显 有一个肮脏的白色背景 有非常浅灰色的水平线 其次 颜色损失非常轻微 失去对比度和饱和度 我已经删除了所有压缩 将所有质量设置为 100 刷
  • 是否可以通过 WebKit、FireBug 或 IE8 开发工具等调试器来调试动态加载 JavaScript?

    From 我最近的问题 我已经创建了一些用于动态加载部分视图的 JavaScript 函数 但我无法调试任何动态加载 JavaScript 因为所有加载的 JavaScript 都将由 eval 函数进行评估 我找到了一种创建新 JavaS
  • libusb_claim_interface 在 Mac OS X Mountain Lion 上失败

    我已经搜索了几个小时但没有结果 我到处都看到过libusb detach kernel driverMac OS X 不支持 但我还没有找到它的补丁或替代方案 libusb claim interface返回这个 libusb 0 8633
  • Django表单中,自定义SelectField和SelectMultipleField

    我现在每天都使用 Django 已经三个月了 它真的很棒 快速 Web 应用程序开发 我还有一件事不能完全按照自己的意愿去做 它是选择字段和选择多个字段 我希望能够将一些参数添加到 Select 的选项中 我终于成功使用 optgroup