2011-04-19 11 views
3

に新しいフォームフィールドを追加し、管理インターフェースで使用されるフォームのために、(私はこのblog postを使用しました)フィールドが私の管理フォームに表示されません!それは管理者の仕事の仕方に関連する問題でしょうか?またはModelFormに?私は動的に新しいフォームフィールドを追加しようとしています動的に管理

ありがとうございました!

セバスチャン・

PS:私は

答えて

2

テンプレートでフォームをレンダリングするとき、フィールドセットではなくフィールドセットから列挙するフィールドがフィールドからではなくなります。もちろん、AdminFormのフィールドセットを再定義することはできますが、元のフォームクラスにこのようなフィールドがないため、検証は失敗します。私が提案できる1つの回避策は、フォーム定義でこのフィールドを静的に定義し、そのフィールドをフォームののinitメソッドで動的に再定義することです。次に例を示します。

​​3210
+0

答えをありがとう!私は実際にそれをやろうと考えていました...しかし、私はこの部分をフィールドからではなく、fieldsets変数から列挙するフィールドにしませんでした。あなたはAdminFormのフィールドセットを再定義できますか?そのfieldsets変数は何ですか?あなたは、すべてのフィールドを含む "fields"変数と、それらのレンダリングに使用される "fieldsets"があることを意味しますか?その場合、なぜ新しいフィールドを「フィールドセット」と「フィールド」の両方に追加しないのですか? – sebpiq

+0

テンプレートを見てください。テンプレートをオーバーライドする(または既にオーバーライドしている場合は更新する)こともできます。 –

0

ジャンゴ1.3を使用しています私は実際に私は、現時点でて働いている同じ問題を持っています。 理想的ではありませんが、私の使用事例で機能する一時的な回避策が見つかりました。それはあなたの役に立つかもしれませんか?

私の場合、フィールドの静的な名前があるので、ModelFormで宣言しました。通常通り、()を上書きして、いくつかのオプションをオーバーライドします。

すなわち:私は前に述べたように

def statemachine_form(for_model=None): 
    """ 
    Factory function to create a special case form 
    """ 
    class _StateMachineBaseModelForm(forms.ModelForm): 
     _sm_action = forms.ChoiceField(choices=[], label="Take Action") 

     class Meta: 
      model = for_model 

     def __init__(self, *args, **kwargs): 
      super(_StateMachineBaseModelForm, self).__init__(*args, **kwargs) 
      actions = (('', '-----------'),) 
      for action in self.instance.sm_state_actions(): 
       actions += ((action, action),) 
      self.fields['_sm_action'] = forms.ChoiceField(choices=actions, 
                  label="Take Action") 
    if for_model: return _StateMachineBaseModelForm 

class ContentItemAdmin(admin.ModelAdmin): 
    form = statemachine_form(for_model=ContentItem) 

は今、これは完全に「動的」ではありませんが、これは当分の間、私のために尽くします。

フィールドを動的に追加すると、最初に宣言しなくても実際には存在しないという同じ問題があります。これは実際には、ModelFormがフィールドを作成する方法と関係があると思います。

私は他の誰かが私たちにいくつかの情報を与えることを望んでいます。

+0

ああ私は、フォームを生成するファクトリ関数を使用してい気づくこと。これは解決策を見つけようとしている私の一部です。私はここにこれについての文書を走らせた:http://www.b-list.org/weblog/2008/nov/09/dynamic-forms/ – Andre

+0

まあ...それは実際に働くことができた!例えば、隠された入力で10の無駄なフィールドを宣言し、次にそれらを「動的に切り替える」ことができます...しかしそれはあまり美しくありません。この回避策をありがとう!現時点では、私はフィールドを静的に宣言するだけでいいです... – sebpiq

-2

はでsuper.initを呼び出す前に、フィールドを追加してください:

def __init__(self, *args, **kwargs): 
    self.fields['test'] = forms.CharField(label='test') 
    super(ServiceRoleAssignmentForm, self).__init__(*args, **kwargs) 
+0

fields属性は、フォーム上でsuperを呼び出すまで存在しません。 –

関連する問題