2013-05-07 69 views
1

我想获得选择表单,它可以显示所有拥有组名“sale”的用户。 我对我的形式定义是这样的:Django动态表单ValueError

class ArrangeUserForm(forms.Form): 
    def __init__(self, *args, **kwargs): 
     super(ArrangeUserForm, self).__init__(*args, **kwargs) 
     user_choices = [] 
     for user in User.objects.all(): 
      if user.groups.filter(name="sale"): 
       user_choices.append(user.first_name) 
     self.fields['user_field'] = forms.ChoiceField(widget=forms.Select, choices=user_choices) 

    mobile = forms.CharField(widget=forms.TextInput, max_length=11, min_length=11) 

,我的看法是这样的:

class ArrangeUserHandler(View): 
def get(self, request): 
    form = ArrangeUserForm() 
    return render(request, 'student/student_form.html', {'form': form,}) 

def post(self, request): 
    pass 

,当我跑我的这一观点代码和要求,我得到了以下错误:

ValueError异常在/学生/ arrangeuser/

值过多解压

有人能告诉我这里有什么问题吗?

回溯:

request Method: GET 
Request URL: http://domain/student/arrangeuser/ 

Django Version: 1.5 
Python Version: 2.7.3 
Installed Applications: 
('django.contrib.auth', 
'django.contrib.contenttypes', 
'django.contrib.sessions', 
'django.contrib.sites', 
'django.contrib.messages', 
'django.contrib.staticfiles', 
'django.contrib.admin', 
'django.contrib.admindocs', 
'accounts', 
'student', 
'order') 
Installed Middleware: 
('django.middleware.common.CommonMiddleware', 
'django.contrib.sessions.middleware.SessionMiddleware', 
'django.middleware.csrf.CsrfViewMiddleware', 
'django.contrib.auth.middleware.AuthenticationMiddleware', 
'django.contrib.messages.middleware.MessageMiddleware') 


Template error: 
In template /home/rogerliu/newproject/crm/templates/student/student_form.html, error at line 7 
    too many values to unpack 
    1 : 


    2 : <form method="post"> 


    3 :   {% csrf_token %} 


    4 :   {% for field in form %} 


    5 :     <div class="fieldWrapper"> 


    6 :       {{ field.errors }} 


    7 :       {{ field.label_tag }}: {{ field }} 


    8 :     </div> 


    9 :   {% endfor %} 


    10 :   <input type="submit" value="submit" /> 


    11 : 


    12 : </form> 

    13 : 


    14 : 

Traceback: 
File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py" in get_response 
    115.       response = callback(request, *callback_args, **callback_kwargs) 
File "/usr/local/lib/python2.7/dist-packages/django/views/generic/base.py" in view 
    68.    return self.dispatch(request, *args, **kwargs) 
File "/usr/local/lib/python2.7/dist-packages/django/views/generic/base.py" in dispatch 
    86.   return handler(request, *args, **kwargs) 
File "/home/rogerliu/newproject/crm/student/views.py" in get 
    318.   return render(request, 'student/student_form.html', {'form': form,}) 
File "/usr/local/lib/python2.7/dist-packages/django/shortcuts/__init__.py" in render 
    53.  return HttpResponse(loader.render_to_string(*args, **kwargs), 
File "/usr/local/lib/python2.7/dist-packages/django/template/loader.py" in render_to_string 
    177.   return t.render(context_instance) 
File "/usr/local/lib/python2.7/dist-packages/django/template/base.py" in render 
    140.    return self._render(context) 
File "/usr/local/lib/python2.7/dist-packages/django/template/base.py" in _render 
    134.   return self.nodelist.render(context) 
File "/usr/local/lib/python2.7/dist-packages/django/template/base.py" in render 
    830.     bit = self.render_node(node, context) 
File "/usr/local/lib/python2.7/dist-packages/django/template/debug.py" in render_node 
    74.    return node.render(context) 
File "/usr/local/lib/python2.7/dist-packages/django/template/defaulttags.py" in render 
    188.       nodelist.append(node.render(context)) 
File "/usr/local/lib/python2.7/dist-packages/django/template/debug.py" in render 
    87.    output = force_text(output) 
File "/usr/local/lib/python2.7/dist-packages/django/utils/encoding.py" in force_text 
    99.     s = s.__unicode__() 
File "/usr/local/lib/python2.7/dist-packages/django/forms/forms.py" in __str__ 
    411.   return self.as_widget() 
File "/usr/local/lib/python2.7/dist-packages/django/forms/forms.py" in as_widget 
    458.   return widget.render(name, self.value(), attrs=attrs) 
File "/usr/local/lib/python2.7/dist-packages/django/forms/widgets.py" in render 
    555.   options = self.render_options(choices, [value]) 
File "/usr/local/lib/python2.7/dist-packages/django/forms/widgets.py" in render_options 
    579.   for option_value, option_label in chain(self.choices, choices): 

Exception Type: ValueError at /student/arrangeuser/ 
Exception Value: too many values to unpack 

+1

您可以添加完整的回溯。 – Rohan 2013-05-07 07:17:26

+0

好吧,我会尽快添加它 – 2013-05-07 07:20:21

+1

不应该选择一个哈希?尝试'元组(enumerate(user_choices))' – 2013-05-07 07:35:03

回答

2

按我的意见,选择需要一个键,值映射,使用:

tuple(enumerate(user_choices)) 
0

我的问题是:你是如何定义你的模特? 你能从组中获得用户吗? 你能从用户那里得到这些组吗? 类似的东西:

groups = Group.objects.get(pk=1) 
groups.users 

user = User.objects.get(pk=1) 
user.groups 

你可以做,在你的代码写这本:

#models.py 
class User(Model): 
    name = CharField(max_length=200) 

class Group(Model): 
    name = CharField(max_length=200) 
    users = ManyToManyField(User, related_name="groups") 

#forms.py 
class ArrangeUserForm(forms.Form): 
    def __init__(self, *args, **kwargs): 
     super(ArrangeUserForm, self).__init__(*args, **kwargs) 
     groups = groups.objects.filter(name="sale") 
     user_choices = User.objects.filter(groups_in=groups) 
     self.fields['user_field'] = forms.ChoiceField(widget=forms.Select, choices=user_choices) 

    mobile = forms.CharField(widget=forms.TextInput, max_length=11, min_length=11) 

#And you views.py 
class ArrangeUserHandler(FormView): 
    form_class = ArrangeUserForm 
    template_name = 'student/student_form.html' 

    def form_valid(self, form): 
     #When the form is valid 
     return super(ArrangeUserHandler, self).form_valid(form) 

    def form_invalid(self, form): 
     #When the form is invalid 
     return super(ArrangeUserHandler, self).form_invalid(form) 

我认为它应该做工精细,快捷。 你会告诉我这条线是否有效?

# ... 
groups = groups.objects.filter(name="sale") 
user_choices = User.objects.filter(groups_in=groups) 
# ... 

我希望有帮助。 请参阅 ManyToMany field和 的文档FormView如果您在django 1.5中

+0

感谢您的回答,Hedde早些时候回答并解决了问题,所以我只能接受他的回答: ) – 2013-05-08 01:50:52

+0

没问题,但考虑重新编写你的查询,你正在为db中的每个用户制作'User.objects.all()'和'user.groups.filter(name =“sale”)''。你正在获取所有的用户对象,然后制作foreach并由每个人进行查询。我正在做2个查询'groups.objects.filter(name =“sale”)'和'User.objects.filter(groups_in = groups)'。这是快速和可读的。再见! – lalo 2013-05-08 12:03:46