2013-07-30 7 views
53

管理サイトにモデルが登録されています。そのフィールドの1つは長い文字列式です。これらのフィールドの値に基づいて、長い文字列式を作成して関連するモデルフィールドに保存するという管理者のこのモデルの追加/更新ページにカスタムフォームフィールドを追加したいと思います。django admin - モデルの一部ではないカスタムフォームフィールドを追加します

どうすればいいですか?

更新日: 基本的には、シンボルから数学的または文字列式を構築することです(ユーザーがモデルの一部ではないカスタムフィールドです)。保存をクリックすると、文字列表現をシンボルのリストから取り出し、DBに格納します。私はシンボルがモデルとDBの一部であり、最終的な表現だけであることは望ましくありません。

答えて

20

管理者で行うことは可能ですが、非常に簡単な方法はありません。また、私はあなたのモデルにほとんどのビジネスロジックを保持するためのアドバイスをしたいので、Django Adminに依存することはありません。

モデルに2つの別個のフィールドがあると、もっと簡単になり(おそらくさらに良いかもしれません)。次に、それらを組み合わせたモデルにメソッドを追加します。例えば

class MyModel(models.model): 

    field1 = models.CharField(max_length=10) 
    field2 = models.CharField(max_length=10) 

    def combined_fields(self): 
     return '{} {}'.format(self.field1, self.field2) 

が次にadminにあなたが読み取り専用フィールドとしてcombined_fields()を追加することができます。

class MyModelAdmin(models.ModelAdmin): 

    list_display = ('field1', 'field2', 'combined_fields') 
    readonly_fields = ('combined_fields',) 

    def combined_fields(self, obj): 
     return obj.combined_fields() 

データベースにcombined_fieldsを保存したい場合にも、それを救うことができますモデルを保存するとき:

def save(self, *args, **kwargs): 
    self.field3 = self.combined_fields() 
    super(MyModel, self).save(*args, **kwargs) 
+2

おかげで、これは私は何ではありません探している。カスタムフィールドをDBに保存する必要はなく、計算された文字列だけを保存します。基本的に私がやっているのは、記号から数学的または文字列式を構築することです。ユーザーはシンボルを選択します(これらはモデルの一部ではないカスタムフィールドです)。そして、彼がsaveをクリックすると、シンボルに変換してDBに格納します。 – michalv82

+0

@ michalv82モデルの 'save()'メソッドでデータベースに保存して、私の答えの更新をチェックすることもできます。 – rednaw

+0

もう一度お返事ありがとうございますが、最後のフィールド(記号)を組み合わせたフィールドを保存したくないという問題があります。最後の文字列を保存したいだけです。 – michalv82

3

もしあなたが本当に

私はこのような何かをやったことがないので、私はそれがうまくいくか完全にわかりません。

101

admin.pyまたは別のforms.pyのどちらかで、ModelFormクラスを追加して、普通のように余分なフィールドを宣言することができます。

  1. 編集あなたの管理者:ちょうどadminに登場する追加のフィールドを持っているために

    class YourModelForm(forms.ModelForm): 
    
        extra_field = forms.CharField() 
    
        def save(self, commit=True): 
         extra_field = self.cleaned_data.get('extra_field', None) 
         # ...do something with extra_field here... 
         return super(YourModelForm, self).save(commit=commit) 
    
        class Meta: 
         model = YourModel 
    

    :私はまた、あなたがform.saveでこれらの値を使用する方法の一例を()与えてくれました。PYと上記で作成したフォームで

  2. があなたの新しいフィールドを含めるを参照するために、フォームのプロパティを設定し、あなたのフィールドまたはフィールドセットの宣言このよう

​​

UPDATE:ジャンゴ1.8で ますYourModelFormのメタクラスにfields = '__all__'を追加する必要があります。

+4

この回答が受け入れられない理由はありますか? – sthzg

+2

はい私は本当に理由を知りたいです – Vishnu

+8

'meta'クラスに' fields = '__all __' 'を追加する必要があります。そうでなければdjangoは次のように文句を言います: 'fields'属性または 'exclude'属性を持たないModelFormを作成することは推奨されません' – IsaacKleiner

4

あなたは常に新しい管理テンプレートを作成し、あなたが(あなたのadmin_viewにURLを追加し、管理をオーバーライドする)あなたのadmin_viewに必要なものを行うことができます答えを

url(r'^admin/mymodel/mymodel/add/$' , 'admin_views.add_my_special_model') 
関連する問題