2009-10-20 18 views
6

ある時点で​​の"disabled"(灰色で囲まれたdisabled="disabled"属性)入力を表示する必要があります。標準(xhtmlおよびhtml4)で指定されているように、タイプ​​の入力には"readonly"属性を含めることはできません。これはプレゼンテーションの目的のみであり、実際の値はPOSTで終わる必要があることに注意してください。Djangoフォーム:無効なフィールドをバリデーションの間に残す

initial_val = 'to be' 
form = SomeForm(ititial={'field':initial_val, 
         'mock_field':initial_val}) 

をそして、すべてが順調です。そして、それは次のように初期化され

from django import forms 

_choices = ['to be', 'not to be'] 
class SomeForm(forms.Form): 
    field = forms.ChoiceField(choices=[(item, item) for item in _choices], 
        widget=forms.HiddenInput()) # the real field 

    mock_field = forms.ChoiceField(required=False, # doesn't get submitted 
         choices=[(item, item) for item in _choices], 
         label="The question", 
         widget=forms.Select(attrs={'disabled':'disabled'})) 

を:だから、ここで私は何をすべきか(ジャンゴのフォーム宣言の一部を引用)されます。フォームが検証され、他のフィールドの1つが検証に失敗するまで。これが起きると、フォームは再ロードされ、値は保存されますが、 "mock_field"の値は保持されません。送信されない(無効になります)。それは保存されていません。これはデータの整合性には影響しませんが、プレゼンテーションにはそれほど適していません。

可能な限り小さなハッカーで、そのフィールドを保存する方法はありますか?フォームはdjango.contrib.formtools.FormWizardの一部であり、初期値(およびいくつかのフィールド)は動的に生成されます。基本的には、すでに多くのことが進んでいますが、事を過度に複雑化しないようにすることができれば素晴らしいことでしょう。

答えて

1

これは初めての質問ですが、解決策を見つけましたハックです)それは動作します。

- self.fields['whatever'].initialはコンストラクタ内でNoneと思われるフォームインスタンスから初期値を取得する代わりに、キーワード引数 "initial"から値を取得しています。そして、私はそれを "モック"フィールドのための唯一の選択肢として設定しました。このように:

from django import forms 

_choices = ['to be', 'not to be'] 
class SomeForm(forms.Form): 
    field = forms.ChoiceField(choices=[(item, item) for item in _choices], 
        widget=forms.HiddenInput()) # the real field 

    mock_field = forms.ChoiceField(required=False, # doesn't get submitted 
         choices=[(item, item) for item in _choices], 
         label="The question", 
         widget=forms.Select(attrs={'disabled':'disabled'})) 

    def __init__(self, *args, **kwargs): 
     super(SomeForm, self).__init__(*args, **kwargs) 
     mock_initial = kwargs['initial']['field'] 
     self.fields['mock_field'].choices = [(mock_initial, mock_initial),] 

おそらく、エラー処理が必要です。明らかに、初期値が実際のfieldに与えられていない場合、これは機能しません。

3

ブラウザはPOSTフィールドを無効にしません。あなたのフォームの__init__

def __init__(self, *args, **kwargs): 
    super(SomeForm, self).__init__(*args, **kwargs) 
    mock_initial = self.fields['field'].initial 
    self.fields['mock_field'].initial = mock_initial 

mock_fieldfieldの初期値をコピーしようとすることができます

コードがテストされていません。通常はform.dataについても心配していますが、この場合はそれ以外で違いはありませんinitial

+0

私は、無効なフィールドが投稿されていないことを知っています(成功したコントロールのみが表示され、無効なフィールドは決して成功しないため)。今あなたのアプローチをテストしようと思います。それはかなり説得力があります。 – shylent

関連する問題