【问题标题】:Django: how to highlight groups in a `SelectField`?Django:如何突出显示“SelectField”中的组?
【发布时间】:2010-12-07 12:34:36
【问题描述】:

我有一份工作列表,每个工作都属于一个组:

class Job(models.Model):
    name = models.CharField(max_length = 200)
    group = models.CharField(max_length = 200)

如何显示SelectField,其中组突出显示,对应的工作在下面列出?

我已经看到this 这篇文章,这是我的第一步,但我想了解更多详情。

谢谢

【问题讨论】:

    标签: django django-templates django-forms


    【解决方案1】:

    您可能想考虑将group 变成ForeignKeyGroup 模型,但是使用给定的模型,您可以利用Django 表单的ChoiceFields allowspecify groups for choices 的事实,呈现为<optgroup>s:

    from itertools import groupby
    from operator import attrgetter
    
    from django import forms
    
    from myapp.models import Job
    
    def get_grouped_job_choices():
        choices = []
        for group, jobs in groupby(Job.objects.all().order_by('group', 'name'),
                                   attrgetter('group')):
            choices.append((group, [(job.pk, job.name) for job in jobs]))
        return choices
    
    class ExampleForm(forms.Form):
        job = forms.ChoiceField(choices=get_grouped_job_choices)
    

    【讨论】:

    • 我真的很喜欢这个方法,但我有以下错误:Caught TypeError while rendering: 'function' object is not iterable 我不知道它来自哪里。
    • 好的,这是因为您忘记了 job = forms.ChoiceField(choices=get_grouped_job_choices()) 中的括号
    • 要在模型而不是表单中使用它,您需要使用IntegerField 而不是CharField(请参阅osdir.com/ml/django-users/2010-05/msg00760.html),否则会出现“值错误”
    【解决方案2】:

    insin 提供了一种很好的查看方式。

    但是,有一个内置的 django 模板标签可以做到这一点!

    您可以使用regroup 模板标签来做到这一点。

    来自文档,

    {% regroup job by group as group_list %}
    
    <ul>
    {% for group in gender_list %}
        <li>{{ group.grouper }}
        <ul>
            {% for item in group.list %}
            <li>{{ item }} </li>
            {% endfor %}
        </ul>
        </li>
    {% endfor %}
    </ul>
    

    【讨论】:

    • 不错!但是我看不到如何将其插入ChoiceField
    • 你不能。您可能必须创建一个遵循相同模板标记方式的小部件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-28
    • 2021-11-29
    • 2019-02-06
    • 1970-01-01
    • 1970-01-01
    • 2011-07-07
    • 1970-01-01
    相关资源
    最近更新 更多