Conditionally show and hide a form field and set the field value
Asked Answered
S

2

8

I have a form in my Django that looks something like this:

class PersonnelForm(forms.Form):
    """
    Form for creating a new personnel.
    """
    username = forms.RegexField(
        required=True, max_length=30, label=_("Name")
    )
    is_manager = forms.BooleanField(
        required=True, label=_("Is Manager")
    )

I use this form in two places in my site. One one of the places, I'd like to display the form and all of its fields except the is_manager field but I would like to set the default value of this field to True. In the other place, I'd like to display the form and all of its fields including the is_manager field and I would like it to have a default value of False.

How can I accomplish this? Seems to be a trivial thing but I can't figure it out.

Thanks.

Skycap answered 16/7, 2011 at 12:9 Comment(0)
A
16

You could use the form's __init__ method to hide (or delete) the field, i.e.

class PersonnelForm(forms.Form):
    """
    Form for creating a new personnel.
    """
    username = forms.RegexField(
        required=True, max_length=30, label=_("Name")
    )
    is_manager = forms.BooleanField(
        required=True, label=_("Is Manager")
    )

    def __init__(self, *args, **kwargs):
        delete_some_field = kwargs.get('delete_some_field', False)
        if 'delete_some_field' in kwargs:
            del kwargs['delete_some_field']
        super(PersonnelForm, self).__init__(*args, **kwargs)
        if delete_some_field:
            del self.fields['is_manager']
            # or
            self.fields['is_manager'].widget = something_else

#views.py
form = PersonnelForm(...., delete_some_field=True)
Adoree answered 16/7, 2011 at 12:37 Comment(2)
Hi Klaas. I changed the widget to a hidden input. How can i assign a default value to it? Thanks.Skycap
you can either user the "initial" keyword argument to the field, or change the form's "initial['field']", I always forget which one actually works.Adoree
R
1

If the functionalities are different, you can use inherit one form from the other and display sutiably(i.e exclude fields).

Also, Form's init method can be made to take arguments, and this can be used to initialize the form's field values.

Raddi answered 16/7, 2011 at 13:37 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.