0

ほんの一握りのエントリしかないテーブルがあります。スタッフが毎回クリックして編集ページに移動するのではなく、リストにインラインを使用できればいいのにと思います。

つまり、通常はモデル オブジェクトのリストが表示されるリンクをクリックすると、インラインで表示されるモデル オブジェクトが表示されるはずです。

私はこのようなことを試しましたが、当然のことながら、外部キーがないためエラーが発生します:

class MyModelInline(admin.StackedInline): 
    model = MyModel               

class MyModelAdmin(admin.ModelAdmin): 
    inlines = [MyModelInline,]    

admin.site.register(MyModel, MyModelAdmin)
4

1 に答える 1

0

説明したように機能するには、データの親になる「エディター」モデルが必要です。表示するすべての行には、単一の「エディター」モデル オブジェクトへの外部キーが必要です。したがって、models.py では次のようになります。

from django.db import models

class Editor(models.Model):
    pass

class MyModel(models.Model):
    name = models.CharField(max_length=100) # Field added for demonstration
    # ... add any other fields you like ...
    editor = models.ForeignKey(Editor)

そしてadmin.pyで:

from django.contrib import admin
from Test.models import Editor, MyModel

class MyModelInline(admin.StackedInline):
    model = MyModel

class EditorAdmin(admin.ModelAdmin):
    inlines = [MyModelInline,]
admin.site.register(Editor, EditorAdmin)

その他の考慮事項:

プログラムで新しい MyModel() オブジェクトを作成するときは、外部キーが常にエディターを指すように設定する必要があります。あなたが説明したように、これが機能するには、エディターのインスタンスは1つだけである必要があります。管理インターフェイスを使用する場合、エディタ オブジェクトの管理ページを使用して、この外部キーを自動的に設定する必要があります。本番環境では、自分以外の全員に対してエディタ オブジェクトの作成と削除を制限することをお勧めします。誰かがエディター オブジェクトを削除すると、すべての MyModel オブジェクトも消えます。


代替オプション:

1) 管理者が行っている編集が単純な場合は、代わりに「アクション」を実装することをお勧めします。

2) admin テンプレートをオーバーライドする可能性もあります。Django が更新されるたびに、変更が新しい機能に干渉していないことを確認する必要があるため、個人的にはこのオプションがあまり好きではありません。ただし、管理インターフェイスでより高度な操作を行うには、これが唯一の方法である場合があります。私は自分のプロジェクトでこれを行いましたが、変更を最小限に抑えたいと思っています。

于 2013-01-15T20:17:47.110 に答える