Python Django:如何隐藏所有表单字段?
我有一个Django表单类,大约有8个字段。如何动态地将所有这些表单字段隐藏在我的一个视图中 样本: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
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'。谢谢它起作用了。修复了答案中与问题同步的一些代码。