0

何日も頭を悩ませた後、誰かが私に正しいアプローチを教えてくれることを願っています. ページ、要素、スタイル、投稿の4つのモデルがあります。

これが私の単純化されたmodels.py/admin.pyの抜粋です:http://pastebin.com/uSHrG0p2

2文で:

要素は 1 つのスタイルと 1 つの投稿 (2 つの FK) を参照します。

ページは多くの要素を参照でき、要素は多くのページで参照できます (M2M)。

Page インスタンスの管理サイトでは、M2M 関係を「インライン」として含めました。要素インスタンスを選択するための複数の行があるようにします。1 行は次のようになります: [My Post A with My Style X][V]

私が望むのは、その 1 つのドロップダウンを 2 つのドロップダウンに置き換えることです。1 つは Post のすべてのインスタンスを持ち、もう 1 つは Style のすべてのインスタンスを持ちます (Element インスタンスをインプレースで作成します)。そのため、1 つの行が Element 管理サイトのようになります: [My Post A][V] [My Style X][V]

簡単に聞こえますが、ModelForms、ModelAdmins、Formsets などを 2 日間読んで実験した後、完全に迷ってしまいました。Django 管理機能内のカスタム ビュー/フォームなしでそれを行うことはできますか?

私のアプローチの 1 つは、このように PageAdminForm から Post/Style インスタンスにアクセスし、そこから手動でフォーム ウィジェットを作成しようとすることでした...しかし、そうすることができませんでした:

p = Page.objects.get(pk=1)
f = PageAdminForm(instance=p)
f.base_fields['elements'].choices.queryset[0].post

私が行く必要があるアドバイスやヒントはありますか?お時間をいただきありがとうございます!

4

1 に答える 1

1

M2Mフィールドを削除し、Elementsの3番目のForeignKeyを使用してElementsをページにリンクした後、私はまさに欲しいものを手に入れました。

class Element(models.Model):
    page = models.ForeignKey(Page)        
    post = models.ForeignKey(Post)
    style = models.ForeignKey(Style)

実際、M2M以外のリンクは、結局のところ私のアプリケーションにとってより理にかなっています。

自己へのメモ:Djangoの裏をかくことを試みる前に、モデルの関係を再考してください:-(

于 2011-03-03T08:06:45.487 に答える