22

私はたくさん読んできましたが、これに対する解決策を見つけることができないようです。

私は Django でアプリケーションを書いていますが、まだ管理者側を書いています。

「環境」と呼ばれるモデルと「サーバー」と呼ばれるモデルがあります。特定の環境に複数のサーバーがあるなど、サーバーと環境の間には ForeignKey 関係があります。

管理インターフェイスで環境の「追加」フォームを変更する場合、インライン フォームを使用して、環境に関連付けられるサーバーのリストを次のように視覚化できます。

class ServerInline(admin.TabularInline):
    model = Server
    extra = 39

class EnvironmentAdmin(admin.ModelAdmin):
    inlines = [ServerInline]

かなり単純ですよね?

私がやりたいことは、サーバーのインラインフォームにデフォルト値を事前入力することです.これを行うことで同じ値を事前入力することができました:

class ServerInlineAdminForm(forms.ModelForm):
    class Meta:
        model = Server

    def __init__(self, *args, **kwargs):
        super(ServerInlineAdminForm, self).__init__(*args, **kwargs)
        self.initial['name']='Testing'

class ServerInline(admin.TabularInline):
    form = ServerInlineAdminForm
    model = Server
    extra = 39

class EnvironmentAdmin(admin.ModelAdmin):
    inlines = [ServerInline]

しかし、これは私が望むものではありません。リストにある 39 の異なる値で 39 のサーバー フォーム インスタンスを初期化できるようにしたいと考えています。それを行うための最良の方法は何でしょうか??

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

4

6 に答える 6

8

なぜこれをしたいのか正確にはわかりませんが、おそらくモデルフォームセットを作成することができます:

from django.forms.models import BaseModelFormSet
class ServerFormSet(BaseModelFormSet):
    def __init__(self, *args, **kwargs):
        super(ServerFormSet, self).__init__(*args, **kwargs)
        self.initial = [{ 'name': 's1', }, {'name': 's2'},] # supply your list here

これをインラインに設定します:

class ServerInline(admin.TabularInline):
    form = ServerInlineAdminForm
    model = Server
    extra = 39
    formset = ServerFormSet

私はこれを試していません。

参照: https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.InlineModelAdmin.formset

https://docs.djangoproject.com/en/dev/topics/forms/modelforms/#providing-initial-values

https://docs.djangoproject.com/en/dev/topics/forms/formsets/#using-initial-data-with-a-formset

于 2012-09-12T16:01:59.887 に答える
4

私は自分で問題を解決したことに気づき、ここでは答えていませんでした。

私が最終的に行ったことは、管理フォームを使用する代わりに、Environmentクラスのsave_modelメソッドをオーバーライドすることです。

もう少し詳しく説明します。

環境オブジェクトとサーバーオブジェクトがあります。環境には、外部キーを介してサーバーオブジェクトにリンクされている多数のサーバーがあります。私の目標は、環境作成プロセスで環境に関連付けられたサーバーにデータを取り込むことでした。これを実行するには、Environmentオブジェクトのsave_modelメソッドをオーバーライドし、obj.save()を実行し、AFTERWARDSでこの環境を指すServerオブジェクトを作成してから、もう一度obj.save()を作成します。なぜその後?新しく作成したサーバーを、まだ存在していない環境と関連付けることができないためです。実際のコードに興味のある人がいたら教えてください。

于 2012-11-07T11:42:35.507 に答える
3

私はこれを試していませんが、生成された追加のフォームは不可欠な Django フォームセットであるため、ここでドキュメントで説明されているフォームセットに初期データをバインドする必要があります。

ドキュメントを読んだだけで、inlineadmin内で独自のフォームセットを定義し、上記のようにリストからデータをフォームセットに事前入力できるようです。クラスのinitメソッドに事前設定コードを配置することで、それを実現できると思います。

これは非常に手の込んだ説明ではないことは承知していますが、興味深い質問を見つけ、ドキュメントを調べて、次に何を試すべきかについて正しい方向に向けることができると思いました.

于 2012-09-12T15:54:02.360 に答える
2

さて、私は frnhr の答えにコメントしたかったのですが、十分な評判がなかったので:

答えは私にとってはうまくいきました。フォームセット内のフォームをループして、それぞれの初期データを設定するだけで済みました。

class SecondaryModelInlineFormSet(forms.models.BaseInlineFormSet):
    model = SecondaryModel

    def __init__(self, *args, **kwargs):
        super(SecondaryModelInlineFormSet, self).__init__(*args, **kwargs)            
        if self.request.GET.get('something', None):
            # build your list using self.request
            for form in self:
                form.initial = {'field_a':'A',...} #This is what I changed
            self.initial=[{'field_a': 'A', ...}, {}... ]
于 2014-09-18T12:53:31.617 に答える
1

forとuserから事前入力する場合はうまくいきました。request.userStackedInlineTabularInline

def save_formset(self, request, form, formset, change):
    for form in formset.forms:
        form.instance.user = request.user
    formset.save()
于 2016-06-07T07:38:29.320 に答える