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

时间:2010-08-01 23:15:42

标签: python django

我搜索了类似的主题,但没找到我需要的东西..

我使用UserAttributes模型扩展了Users模型,添加了一些额外的字段等等。现在我正在尝试将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()
)

我认为最好将multipleChoiceField转换为ChoiceField

简单地说:

alt text

应该只是SELECT框。

3 个答案:

答案 0 :(得分:4)

在答案中设置表单定义时的选项意味着表单永远不会看到任何已定义的新组。

不应使用具有列表推导的ChoiceField进行选择,而应使用带有queryset参数的ModelChoiceField:

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

答案 1 :(得分:1)

只是一个反馈,因为2小时没有答案,所以thnx到freenode #django =)

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

可以覆盖Meta Class中任何字段的小部件,如下所示:

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 =(我的愚蠢..

答案 2 :(得分:0)

似乎是模型选择错误,因为编辑表单中的当前组不会被选中=“已选择”

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

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)