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

2024-09-28 20:47:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我搜索过类似的话题,但没有找到我需要的。。

我使用UserAttributes模型扩展了用户模型,添加了一些额外的字段等等。。现在我试着把这个做成模型。。所以我这里有点小问题。。

我想将组列为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表,所以我试着这样做,但却显示了一个no表单:

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

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

我想最好是把多回声场转换成ChoiceField

坦率地说:

alt text

应该变成刚才的选择框。


Tags: djangofrom模型importauthmodelsformscontrib
3条回答

似乎modelchoice是错误的,因为编辑表单中的当前组将不会被选中“selected”

这就是最终的解决方案:

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)

在表单定义时设置选项,就像您在答案中所做的那样,这意味着表单将永远看不到任何已定义的新组。

与其将ChoiceField与列表理解一起用于选项,不如将ModelChoiceField与queryset参数一起使用:

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

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

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

可以为元类中的任何字段重写小部件,如下所示:

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

相关问题 更多 >