2

In one of the template pages of my Django app, the page asks for the user to select the choices he wants, from a checkbox list.

The catch is, that there are different choices for different users (for example, based on their past interests, there are different options).

How do you generate Django forms with CheckboxSelectMultiple() fields that generate custom choices for each user?

CodyBugstein
  • 21,984
  • 61
  • 207
  • 363
  • Similar question, here is the answer: http://stackoverflow.com/questions/24225928/how-to-customize-a-django-modelform/24226259#24226259 – lehins Jun 15 '14 at 03:22

1 Answers1

1

In forms.py you need to override the __init__ method, and set there the choices passed from the view when you call the form class.

Here is an example:

class UserOptionsForm(forms.Form):
    user_personal_options = forms.ChoiceField(choices=(),
                                              widget=forms.CheckboxSelectMultiple)

    def __init__(self, *args, **kwargs):
        choices = kwargs.pop('choices', None) # return the choices or None
        super(UserOptionsForm, self).__init__(*args, **kwargs)
        if choices is not None:
            self.fields['user_personal_options'].choices = choices

So in your view:

def user_options(request, user_id):
    if request.method == 'POST':
        form = UserOptionsForm(request.POST)
            if form.is_valid():
                # proccess form data here
                form.save()
    else:
        # render the form with user personal choices
        user_choices = [] # do shometing here to make the choices dict by user_id
        form = UserOptionsForm(choices=user_choices)
elmonkeylp
  • 2,674
  • 1
  • 16
  • 14