2015-02-05 43 views
0

我想写一个表单,允许用户从特定的组中选择尽可能多的用户。但是,当我尝试使用用户列表作为选项时,我收到一个错误消息,说'用户'对象不支持索引。Django MultipleChoiceField用户选择引发错误

它是一个相当标准的形式,主要区别在于该组是基于传递给表单的kwarg过滤的。该表单传递一个project_id(项目对象主键),然后找到与该项目关联的组并生成该字段。

从forms.py

class ModifyTeamForm(forms.Form): 

    action = ChoiceField(choices=[('remove', 'Remove users'), ('promote', 'Promote to lead.')]) 



    def __init__(self, *args, **kwargs): 

     # The project to get the team for 
     project_id = kwargs.pop('project_id', None) 

     super(ModifyTeamForm, self).__init__(*args, **kwargs) 

     project = Project.objects.get(pk=project_id) 

     # Team for this project 
     team = User.objects.filter(groups__name=project.project_name) 

     # Create a form field to select current team members 
     current_team = MultipleChoiceField(required=True, choices = team, widget=CheckboxSelectMultiple) 

     # Add the field 
     self.fields['current_team'] = current_team 

我views.py

@login_required 
def team(request, project_id): 

    if request.method == "POST": 
     # Not yet implemented 
     return 
    else: 
     form = ModifyTeamForm(project_id=project_id) 

     template = loader.get_template('projects/team.html') 

     context = RequestContext(request, { 
      'form': form, 
     }) 

     return HttpResponse(template.render(context)) 

回答

1

这是因为MultipleChoiceField.choices有望成为一个二维数组有效(https://docs.djangoproject.com/en/1.7/ref/forms/fields/#django.forms.ChoiceField.choices)。

所以你可以做这样的事情:

team = [(u.pk, u.email) for u in User.objects.filter(groups__name=project.project_name)] 

这将返回一个列表continaing的

[('user1.pk', 'user1.email'), ('user2.pk', 'user2.email'),...] 

的combintation这将是可用的choices

+0

解决了它,谢谢! – 2015-02-06 16:04:08

相关问题