0

約8つのフィールドを持つDjangoフォームクラスがあります。これらすべてのフォームフィールドをビューの1つに動的に非表示にするにはどうすればよいですか?

サンプル:

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)

これを実行したい理由は、サインアップページの1つで同じフォームを使用してから、他の場所でも同様のフォームを使用して、これらのフォームフィールドを非表示にするためです。「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

views.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 に答える