Python Django:如何隐藏所有表单字段?

Python Django:如何隐藏所有表单字段?,python,html,django,forms,django-forms,Python,Html,Django,Forms,Django Forms,我有一个Django表单类,大约有8个字段。如何动态地将所有这些表单字段隐藏在我的一个视图中 样本: class FormName(forms.Form): first_name = forms.CharField(max_length=20, widget=forms.TextInput(attrs="class":"validate[required,first_name]","tabindex":"4"}), required=True) middle_name = for

我有一个Django表单类,大约有8个字段。如何动态地将所有这些表单字段隐藏在我的一个视图中

样本:

class FormName(forms.Form):
    first_name = forms.CharField(max_length=20, widget=forms.TextInput(attrs="class":"validate[required,first_name]","tabindex":"4"}), required=True)
    middle_name = forms.CharField(max_length=20, widget=forms.TextInput(attrs="class":"validate[middle_name]","tabindex":"5"}), required=False)
    last_name = forms.CharField(max_length=40, widget=forms.TextInput(attrs="class":"validate[required,last_name]","tabindex":"6"}), required=True)

我之所以要这样做,是因为我会在其中一个注册页面中使用相同的表单,然后在其他地方再次使用类似的表单,我希望这些表单字段被隐藏。我不想创建一个单独的类,用“widget=forms.HiddenInput()”复制相同的字段。

如果您需要一个带有隐藏输入的表单,您可以通过向
\uuuu init\uuuu
方法传递额外的变量来通知您的表单,比如:
form=FormName(is\u hidden=True)
。您的表单可能如下所示:

class FormName(forms.Form):
    first_name = forms.CharField(max_length=20, widget=forms.TextInput(attrs="class":"validate[required,first_name]","tabindex":"4"}), required=True)
    middle_name = forms.CharField(max_length=20, widget=forms.TextInput(attrs="class":"validate[middle_name]","tabindex":"5"}), required=False)
    last_name = forms.CharField(max_length=40, widget=forms.TextInput(attrs="class":"validate[required,last_name]","tabindex":"6"}), required=True)

    def __init__(self, *args, **kwargs):
        is_hidden = kwargs.pop('is_hidden', None)
        super(FormName, self).__init__(*args, **kwargs)
        if is_hidden:
            self.fields['first_name'].widget = forms.HiddenInput()
            self.fields['middle_name'].widget = forms.HiddenInput()
            self.fields['last_name'].widget = forms.HiddenInput()
在所有其他情况下,您可以将表单作为ussual使用,而无需传递
is\u hidden
变量,它将使用您定义的默认窗口小部件


此外,您还可以遍历
self.fields
字典,隐藏所有字段小部件,而无需手动覆盖它们中的每一个

如果您需要具有隐藏输入的表单,您可以通过向
\uu init\uuuu
方法传递附加变量来通知表单,如:
表单=表单名称(is\u hidden=True)
。您的表单可能如下所示:

class FormName(forms.Form):
    first_name = forms.CharField(max_length=20, widget=forms.TextInput(attrs="class":"validate[required,first_name]","tabindex":"4"}), required=True)
    middle_name = forms.CharField(max_length=20, widget=forms.TextInput(attrs="class":"validate[middle_name]","tabindex":"5"}), required=False)
    last_name = forms.CharField(max_length=40, widget=forms.TextInput(attrs="class":"validate[required,last_name]","tabindex":"6"}), required=True)

    def __init__(self, *args, **kwargs):
        is_hidden = kwargs.pop('is_hidden', None)
        super(FormName, self).__init__(*args, **kwargs)
        if is_hidden:
            self.fields['first_name'].widget = forms.HiddenInput()
            self.fields['middle_name'].widget = forms.HiddenInput()
            self.fields['last_name'].widget = forms.HiddenInput()
在所有其他情况下,您可以将表单作为ussual使用,而无需传递
is\u hidden
变量,它将使用您定义的默认窗口小部件


此外,您还可以迭代self.fields字典,隐藏所有字段小部件,而不必手动覆盖每个字段

我建议使用基于类的视图,如果您认为要反复使用某些内容,例如表单。您的视图应如下所示:

views.py:

class BaseView(object):

    def __init__(self, request = None , form  = None, <#define anything you want here, like model = None or template = None>):
        if form:
            self.form = form
        else:
            self.form = FormName

        if #AnythingIWant:
            self.anythingiwant = anythingiwant
        else:
            self.anythingiwant = defaultofanythingiwant

    def __call__(self, request):
        self.request = request
        if self.request.method == 'POST':
            return self.POST_handler()
        else:
            return self.GET_handler()

    def POST_handler(self):
        #method to handle post request

    def GET_handler(self):
        #method to handle get request
        #because u want specific form reusable just add:
        # context = {'form' : self.form()}
        # then render a template with the context above

    def extra_context(self):
        return {}
如果要在
GET\u handler()
中添加内容,请使用
extra\u context
,例如,如果要添加其他表单:

views.py:

class ProfileView(BaseView):

    def extra_context(self):
        form = MyCustomForm()
        context = {'custom_form' : form}
        return context
至于url.py:

url(r'^$',ProfileView(),name='profile\u view'),

如果要更改默认表单,只需按如下方式覆盖它:

url(r'^$',ProfileView(form=mycustomform),name='profile\u view'),


现在,您可以在继承
BaseView
的每个视图中使用
mycustomform
。使用基于类的视图的好处是,您可以对任何东西都这样做,而不仅仅是表单,也许您希望反复使用某些模型

我建议使用基于类的视图,如果您认为您将反复使用某些东西,例如:表单。您的视图应如下所示:

views.py:

class BaseView(object):

    def __init__(self, request = None , form  = None, <#define anything you want here, like model = None or template = None>):
        if form:
            self.form = form
        else:
            self.form = FormName

        if #AnythingIWant:
            self.anythingiwant = anythingiwant
        else:
            self.anythingiwant = defaultofanythingiwant

    def __call__(self, request):
        self.request = request
        if self.request.method == 'POST':
            return self.POST_handler()
        else:
            return self.GET_handler()

    def POST_handler(self):
        #method to handle post request

    def GET_handler(self):
        #method to handle get request
        #because u want specific form reusable just add:
        # context = {'form' : self.form()}
        # then render a template with the context above

    def extra_context(self):
        return {}
如果要在
GET\u handler()
中添加内容,请使用
extra\u context
,例如,如果要添加其他表单:

views.py:

class ProfileView(BaseView):

    def extra_context(self):
        form = MyCustomForm()
        context = {'custom_form' : form}
        return context
至于url.py:

url(r'^$',ProfileView(),name='profile\u view'),

如果要更改默认表单,只需按如下方式覆盖它:

url(r'^$',ProfileView(form=mycustomform),name='profile\u view'),


现在,您可以在继承
BaseView
的每个视图中使用
mycustomform
。使用基于类的视图的好处是,您可以对所有内容执行此操作,而不仅仅是表单,也许您希望反复使用某些模型

为什么不将类分开?你能解释一下吗?我可以让第二个类有相同的8个字段,但我可以使用HiddenInput代替TextInput。但我认为这将是一种复杂的方式(我还将复制一些代码)。我在寻找更简单的方法,如果有的话。有吗?为什么不分开上课呢?你能解释一下吗?我可以让第二个类有相同的8个字段,但我可以使用HiddenInput代替TextInput。但我认为这将是一种复杂的方式(我还将复制一些代码)。我在寻找更简单的方法,如果有的话。有吗?我试过你的解决办法。我得到了以下异常:AttributeError:'FormName'对象没有属性'fields'。谢谢它起作用了。修复了答案中与问题同步的一些代码。我尝试了你的解决方案。我得到了以下异常:AttributeError:'FormName'对象没有属性'fields'。谢谢它起作用了。修复了答案中与问题同步的一些代码。