Django用户:获取组列表或如何将MultipleChoiceField转换为ChoiceField
我查了很多类似的话题,但没找到我需要的内容。
我在用户模型(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()
)
我觉得把多选框转换成选择框会更好。
简单来说:
应该变成一个简单的下拉选择框。
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)