有条件显示/隐藏表单字段并设置字段值

8 投票
2 回答
7172 浏览
提问于 2025-04-16 21:40

我在Django里有一个表单,长得像这样:

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

我在网站的两个地方使用这个表单。在其中一个地方,我想显示这个表单和所有字段,但不想显示is_manager这个字段,不过我想把这个字段的默认值设置为True。在另一个地方,我想显示这个表单和所有字段,包括is_manager字段,并且希望它的默认值是False

我该怎么做呢?这看起来是个简单的事情,但我就是搞不定。

谢谢。

2 个回答

1

如果功能不一样,你可以让一个表单从另一个表单继承,这样就可以适当地显示内容(比如可以不显示某些字段)。

另外,表单的初始化方法可以接收参数,这样就可以用来设置表单字段的初始值。

15

你可以使用表单的 __init__ 方法来隐藏(或者删除)这个字段,也就是说:

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)

撰写回答