1

I want to get the select form which can display all the users who have the group name "sale". My definition for my forms is like this:

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)

and my view is like this:

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

def post(self, request):
    pass

when I run my code and request for that view, I got the following error:

ValueError at /student/arrangeuser/

too many values to unpack

could anyone told me what's going wrong here?

Traceback:

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

~

4
  • 1
    Could you add full traceback. Commented May 7, 2013 at 7:17
  • ok, I will add it soon Commented May 7, 2013 at 7:20
  • 1
    shouldn't choices be a hash? try tuple(enumerate(user_choices)) Commented May 7, 2013 at 7:35
  • 1
    It's a pitty I can't vote for you, it works, thank you Hedde Commented May 7, 2013 at 8:13

2 Answers 2

2

As per my comment, choices needs to be a key, value mapping, use:

tuple(enumerate(user_choices))
Sign up to request clarification or add additional context in comments.

Comments

0

My questions are: How did you define your models? Can you get the users from the group? Can you get the groups from the user? something like that:

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

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

You can do that writing this in you code:

#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)

I think that It should work fine and quickly. Will you tell me if this lines work?

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

I hope that helps. see the Documentation of ManyToMany field and FormView if you are in django 1.5

2 Comments

Thanks for your answer, Hedde answered earlier and solved the problem, so I can only accept his answer:)
No problem, but consider re write your queries, yo are making User.objects.all() and user.groups.filter(name="sale") for every user in db. You are getting all user objects, then making foreach and making queries by everyone. I'm making 2 queries groups.objects.filter(name="sale") and User.objects.filter(groups_in=groups). This is quickly and readable. See you!

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.