How do you generate a custom form in Django?

2020-07-26 11:48发布

问题:

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?

回答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)