如何在ModelChoiceField optgroup标签中设置?

例如:

models.py

class Link(models.Model):
    config = models.ForeignKey(Config)
    name = models.URLField(u'Name', null=True, max_length=50)
    gateway = models.IPAddressField(u'Gateway', null=True)
    weight = models.IntegerField(u'Weight', null=True)
    description = models.TextField(u'Description', blank=True)

def __unicode__(self):
    return self.name

forms.py

class LinkForm(ModelForm):
    config = ModelChoiceField(queryset=Config.objects.all(), empty_label="Choose a link",widget=GroupedSelect())

class Meta:
    model = Link

我想这样呈现我的ChoiceField:

example.html

<select id="id_config" name="config">
    <option selected="selected" value="">Choose a link</option>
    <optgroup label="Configuration" >
        <option value="8">Address: 192.168.1.202/255.255.255.0 </option>
        <option value="9">Address: 192.168.1.240/255.255.255.0 </option>
        <option value="10">Address: 192.168.3.1/255.255.255.0 </option>
    </optgroup>
</select>

**UPDATE**

我这样解决了我的问题:

class GroupedSelect(Select):
    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{0}>', flatatt(final_attrs))]
        for index, option_gp in enumerate(self.choices):
            if index == 0:
                option_value = smart_unicode(option_gp[0])
                option_label = smart_unicode(option_gp[1])
                output.append(u'<option value="%s">%s</option>' %  (escape(option_value), escape(option_label)))
                output.append('<optgroup label = "Configuration">')
            elif index!=0 and index <= len(self.choices):
                option_value = smart_unicode(option_gp[0])
                option_label = smart_unicode(option_gp[1])
                output.append(u'<option value="%s">%s</option>' % (escape(option_value), escape(option_label)))          
        output.append(u'</optgroup>')
        output.append(u'</select>')
        return mark_safe('\n'.join(output))

推荐答案

您不需要创建任何自定义字段,Django已经完成了这项工作,只需将选项以良好的格式传递:

MEDIA_CHOICES = (
 ('Audio', (
   ('vinyl', 'Vinyl'),
   ('cd', 'CD'),
  )
 ),
 ('Video', (
   ('vhs', 'VHS Tape'),
   ('dvd', 'DVD'),
  )
 ),
)

Django相关问答推荐

测试DRF中需要授权头

Django显示交叉表格

Htmx如何从事件中访问数据?

如何在Django REST框架中使用FactoryBoy创建不同的项目

__init__()获取了意外的关键字参数';id';

从多个数据库访问 Django 会话

使用自定义的AuthBackend时,无法使用request.user.is_authenticated或@login_required修饰符

我如何获得已循环的每个项目的名称?

如何从 json 模式创建表单?

ImportError:无法导入设置

将 XML 从 URL 解析为 python 对象

如何使用 select_for_update 在 Django 中获取查询?

如何使用 SQL 的IN等字段上的数组过滤 django 查询集?

Django 不调用模型清理方法

Django:如何编写查询以使用多列进行排序,通过模板显示

在 Mac OS X 上安装支持 JPEG 的 PIL

模拟 Django 查询集以测试采用查询集的函数

使用 Django 部署 Google Analytics

如何在 django 中捕获UNIQUE constraint failed404

Django中reverse()和reverse_lazy()的区别