2013-05-07 68 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