如何在表单中覆盖 Django Auth.Group 实例上的__unicode__



我想在表单中对goup实例的名称应用过滤器。这是

我的过滤器

@register.filter(name='prettify_group')
def prettify_group(group):
    try:
        group = group.name
    except TypeError:
        group = group
    if group == 'sysadmin':
        return _('Sysadmin')
    elif group == 'ceo':
        return _("Chef d'entreprise")
    else:
        return group

我的表格

class InternalActorForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        if 'instance' in kwargs and kwargs['instance'] is not None:
            initial['groups'] = [g.pk for g in User.objects.get(username=kwargs['instance'].username).groups.all()]
        super(InternalActorForm, self).__init__(*args, **kwargs)

我的视图模板

这项工作按预期进行

{% if groups %}
    <dt>{% trans 'Groupe (permissions)' %}</dt>
    {% for group in groups %}
        <dd class="inline-item">
        {{ field=group|prettify_group }}
        </dd>
    {% endfor %}
{% endif %}

我的编辑模板

    {{ form }}

问题

我试图通过使用class MyGroup(Auth.Group)扩展core.models中的Auth.Group来覆盖__unicode__()方法,但它不起作用,因为没有等效于 AUTH_USER_MODEL .

但是如何在表单中应用过滤器?

ModelChoiceFieldModelMultipleChoiceField允许您覆盖选择框中的标签。

第一个子类字段类和重写label_from_instance方法。

class GroupMultipleChoiceField(forms.ModelMultipleChoiceField):
    def label_from_instance(self, obj):
        return prettify_group(obj)

现在使用此字段而不是表单中的标准ModelMultipleChoiceField

class InternalActorForm(forms.ModelForm):
    groups = GroupMultipleChoiceField(queryset=Group.objects.all())
    def __init__(self, *args, **kwargs):
        ...

这是一个记录在案的 Django 功能。

另一种解决方案是使用以下过滤值更新此字段中的choices列表:

def __init__(self, *args, **kwargs):
    super(InternalActorForm, self).__init__(*args, **kwargs)
    self.fields['groups'].choices = [(gid, filters.prettify_group(name)) for gid, name in self.fields['groups'].choices]

但我想这是一种按照@catavaran建议去做的黑客方式。

最新更新