0

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

样本:

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()”复制相同的字段。

4

2 回答 2

5

如果您需要一个带有隐藏输入的表单,您可以通过将附加变量传递给__init__方法来通知您的表单,例如:form = FormName(is_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()

在所有其他情况下,您可以像往常一样使用您的表单,而无需传递is_hidden变量,它将使用您定义的默认小部件。

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

于 2012-09-23T14:55:28.217 回答
0

我建议使用基于类的视图,如果你认为你会一遍又一遍地使用某些东西,例如:表单。您的视图应如下所示:

视图.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 {}

稍后如果您想使用该表单,只需继承BaseView,例如:

class IndexView(BaseView):
    #blahblahblah

如果你想在你的GET_handler()使用中添加一些东西extra_context,例如如果你想添加另一个表单:

视图.py:

class ProfileView(BaseView):

    def extra_context(self):
        form = MyCustomForm()
        context = {'custom_form' : form}
        return context

至于 urls.py:

url(r'^$', ProfileView(), name='profile_view'),

如果您想更改默认表单,只需像这样覆盖它:

url(r'^$', ProfileView(form = MyCustomCustomForm), name='profile_view'),

现在您可以MyCustomCustomForm在每个继承的视图中使用BaseView. 使用基于类的视图的好处是你可以对所有东西都这样做,而不仅仅是表单,也许你想一遍又一遍地使用一些模型

于 2012-09-23T15:41:09.490 回答