2011-02-07 12 views
1

私はPHP/ZENDに強いバックグラウンドを持っており、今はPython/Djangoの学習を使用しています。 Zendでは、フォーム要素オブジェクトを取っていつでも編集することができます。これは、完全に新しいフォームオブジェクトを作成せずに、フォームオブジェクトを取り出し、必要に応じて小さな変更を加えることができるため、優れています。私はこれをしようとしていますDjangoにあります。Python/Django - 作成後のモデルフォームを編集する

私はフォームを持っています。それを投票と呼ぶことができます。このフォームには、別のビューメソッドで適用される別のウィジェットが必要な場合があります。私は、オブジェクトがビュー内で作成された後、私はモデルのフォーム要素を変更したい

、基本的に

form = VoteForm(initial={}) 
## then something like 
form.field.widget = newWidget 

つまり...そのような小さな変化を伴うフォーム全体を再作成する必要はありません...

答えて

4

あなたはあなた自身の質問に答えました:それは(ほとんど)あなたがそれを行う方法です。 、私は個人的にこの方法を好む

class VoteForm(forms.Form): 
    myfield = ... 
    def __init__(self, hide_field=False, *args, **kwargs): 
     super(VoteForm, self).__init__(*args, **kwargs) 
     if hide_field: 
      self.fields['myfield'].widget = ... 

form = VoteForm(hide_field=True, initial={}) 

周りの代わりにスプレッドの一箇所ですべてのフォームロジックを保持します:

# tested on 1.2.3 
form = VoteForm(initial={}) 
form.fields['field_name'].widget = forms.HiddenInput() # make sure you call widget() 

form.as_p() # shows new widget 
+0

私はその方法を成功させずに試みました。私は、私が隠すフィールドを持っています。このテクニックを適用すると、フォーム要素は非表示として表示されません。あなたは私にあなたがジャンゴでそれをする方法の例を教えてくれますか? (どのように組み込みのウ​​ィジェットを使用していますか?) – GregL83

+0

ちょっとGregL83、このコードは動作します(1.2.3で今テスト済み)。どのタイプのフィールドを隠そうとしていますか?また、ウィジェット**()** –

+0

フォームフィールド "title = forms.CharField(label =" Header "、required = True)を呼び出していることを確認してください:form ['title']。widget = forms.HiddenInput() – GregL83

1

もう一つの方法は、のようなものを、フォームののinit()メソッドをオーバーライドすることです。あなたのフォームとビューが別々のファイルにあると仮定すると、複数の 'djangoインポートフォームから'ビューでウィジェットを取得する必要はありません。

関連する問題