私は3つのモデルを持っています:
class Top(models.Model):
toptitle = models.CharField(max_length=255, verbose_name='top title')
class Middle(models.Model):
top = models.ForeignKey(Top)
middletitle = models.CharField(max_length=255, verbose_name='middle title')
importantfield1 = models.TextField(verbose_name='important field 1')
importantfield2 = models.TextField(verbose_name='important field 2')
...
importantfield20 = models.TextField(verbose_name='important field 20')
トップの管理ページを表示しているときに、それに関連するミドルを確認したい (このページまたはこのページのリンクからミドルを追加および編集できるようにする)。
インラインで十分に簡単に行うことができます。問題は、Middle に非常に多くの (必須) フィールドがあると扱いにくくなることです。
インラインがミドルタイトルのみを表示するように指定した場合
class MiddleInline(admin.TabularInline):
model = MiddleInline
fields = ('middletitle',)
extra = 0
2 つの問題があります。1 つ目は、既に存在するミドルのすべてのフィールドを編集できるページにアクセスする方法がないことです ([管理] メニューに移動して [ミドル] を選択し、そこで適切なミドルを見つける必要はありません)。 . 2 つ目の問題は、このインラインから別のミドルを追加しようとすると、ミドルタイトルだけでミドルを作成できるが、必要な重要フィールドがすべて空のままになることです。
オブジェクトを編集するためのリンクを追加することで、最初の問題に対処できました。
class MiddleInline(admin.TabularInline):
def changeform_link(self,instance):
if instance.id:
changeform_url = reverse(
'admin:myapp_middle_change', args=(instance.id,)
)
return '<a href="'+ changeform_url + '" target="_blank">Details</a>'
return ''
changeform_link.allow_tags = True
changeform_link.short_description = '' # omit column header
model = MiddleInline
fields = ('middletitle','changeform_link')
extra = 0
しかし、今では2番目の問題に対処する方法がわかりません。
理想的には、「別のミドルを追加」セクションで、新しいミドルを作成するためのポップアップを開いて(トップがすでに設定されており、すべての重要なフィールドを持っている/必要としている)、保存するとインラインが更新されるようにしたいと思います。
これを行う方法はありますか?私はこれに完全に間違っていますか?