Django用户:获取组列表或如何将MultipleChoiceField转换为ChoiceField

2 投票
3 回答
9804 浏览
提问于 2025-04-16 02:10

我查了很多类似的话题,但没找到我需要的内容。

我在用户模型(Users model)上扩展了一个用户属性模型(UserAttributes model),添加了一些额外的字段等等。现在我想把它做成一个模型表单(ModelForm),但这里遇到了一点问题。

我想把用户组列成一个选择框(ChoiceField),而不是多选框(MultipleChoiceField)。这是规范要求的,所以必须这样做。

以下是我的代码:

from django.forms               import ModelForm
from django.contrib.auth.models import User
from helpdesk.models.userattributes      import *
from django.utils.translation import ugettext as _

class SettingsOperatorsForm(ModelForm):


    groups = forms.ChoiceField(
        label=_(u'Rights'),
        required=True,
        choices=["what's in here?"]
    )

    class Meta:
        model   = UserAttributes
        fields  = ('first_name', 'last_name', 'job_title', 'email', 'password', 'is_active', 'groups'  )

数据库里有一个叫 auth_group 的表,所以我试着这样做,但结果是根本没有显示表单:

from django.contrib.auth.models import User, Group

groups = forms.ChoiceField(
    label=_(u'Rights'),
    required=True,
    choices=Group.objects.all()
)

我觉得把多选框转换成选择框会更好。

简单来说:

alt text

应该变成一个简单的下拉选择框。

3 个回答

1

只是想反馈一下,因为等了两个小时都没有人回答,所以感谢freenode #django =)

http://docs.djangoproject.com/en/dev/topics/forms/modelforms/

可以在Meta类中像这样覆盖任何字段的小部件:

from django.forms import ModelForm

class AuthorForm(ModelForm):
    class Meta:
        model = Author
        widgets = { 'groups': forms.Select(),}

这个方法不行

forms.ChoiceField() 也不行……没什么变化……还是显示多选框……

更新

from django.contrib.auth.models import User, Group
groups = forms.ChoiceField(
        required=True,
        choices = [ [g.id, g.name] for g in Group.objects.filter() ]
    ) 

这个方法可以……没问题,但为什么小部件覆盖不行呢???

解决了,因为我用的是django 1.1 =( 我真是太傻了……

5

在你定义表单的时候设置选项,就像你在回答中提到的那样,这样做会导致表单永远无法看到任何新定义的组。

与其使用带有列表推导的ChoiceField来设置选项,不如使用带有查询集参数的ModelChoiceField:

groups = forms.ModelChoiceField(queryset=Group.objects.all())
0

看起来是因为在编辑表单中,当前的组没有被选中,所以modelchoice的设置是错误的。

所以,最终的解决方案是:

groups = forms.ModelMultipleChoiceField( 
    queryset=None, 
    required=True, 
    widget=GroupsSelect,
)

 def __init__(self, *args, **kw):  
    super(ModelForm, self).__init__(*args, **kw)
    self.fields['groups'].queryset=Group.objects.filter(user=self.instance.id)

#view
op = UserAttributes.objects.get(id=operator_id)
form = SettingsOperatorsForm(instance=op)

撰写回答