2012-12-17 13 views
8

画像、動画、その他のメディアタイプを含むことができるPostオブジェクトがあるとします。私はそれらを一緒にリンクするためにGenericForeignKeyを使うことができます。ような何か:今DjangoのGenericForeignKeyとAdmin

class MediaObjectAdminInLine(admin.StackedInline): 
    model = MediaObject 
    ct_field = "content_type_media" 
    ct_fk_field = "object_id_media" 
    extra = 0 

class PostAdmin(admin.ModelAdmin): 
    inlines = [MediaObjectAdminInLine] 

質問:)管理者/で、私は簡単に新しいポストを作成することができた:

class Post(models.Model): 
    title = models.CharField(...) 
    text = models.TextField(...) 

class AudioMedia(models.Model): 
    ... 

class VideoMedia(models.Model): 
    ... 

class ImageMedia(models.Model): 
    ... 

class MediaObject(models.Model): 
    post = models.ForeignKey(Post) 
    order = models.IntegerField() 

    content_type_media = models.ForeignKey(
    ContentType, limit_choices_to={ 
     'model__in': (
     'audiomedia', 
     'imagemedia', 
     'videomedia') 
    }) 

    object_id_media = models.PositiveIntegerField() 
    obj = generic.GenericForeignKey('content_type_media', 'object_id_media') 

は今、私は簡単のように、管理インターフェイスを作成することができます。ポストには、MediaObjectを簡単に追加することができます。パネルには、タイプ(オーディオ、ビデオ、...)を選択するドロップダウンメニューがありますが、を手動で入力してください投稿とリンクしたいオブジェクトのIDを入力してください。

私はグラッペリを含むさまざまな拡張機能を試しました。いくつかは、ルックアップの機能を提供しますここにリンクするオブジェクトのID。ここではオブジェクトを追加したいと思います。たとえば、ドロップダウンから選択した内容に応じて、AudioMedia、VideoMedia、ImageMediaを追加します。

提案がありますか?

+0

私はそれを試したことはありませんが、管理者用のフォームを作成することはできません。このフォームは 'object_id'のデフォルトのテキストボックスを' ModelChoiceField'に置き換えますか? – karthikr

答えて

4

これを行うにはかなりの労力が必要です。

  • 管理者は、ドロップダウンから選択したモデルタイプに基づいて、モデルフォームを動的に表示するように求めています。
  • Djangoの管理者はこれを行いません(それには既知の拡張もありません)。

    1. がダウンモデル選択ドロップののonchangeをキャプチャするカスタムJavaScriptのイベントハンドラを記述:

は、この作業を行うには、する必要があります。

  • 次に、Djangoの管理者を呼び出し、そのモデルのインラインモデルフォームを要求します。
  • 現在のHTMLページをそのモデルフォームで更新します。
  • 次に、親モデルのmodelformのsave()メソッドをインターセプトして、どの子モデルが処理しているか把握し、データベースに正しく保存する必要があります。
  • 次に、親モデルのmodelformを取得して、子モデルに応じて適切な子モデルのモデルフォームを正しく表示する方法を整理する必要があります。
  • サウンドデーティング?そうです。

    ここで簡単な方法です:

    は1つだけ「メディア」モデルを持っています。モデルには、あなたのタイプの1つに対してのみ有効なフィールドがいくつかあります(ただし、クロスオーバーは十分です)。

    そのメディアタイプの接頭辞を持つ1つのメディアタイプに固有のフィールドには、すべて「image_size', or video_title`」という名前を付けます。

    メディアタイプのドロップダウンに基づいてフィールドを選択的に表示および非表示にするJavaScriptハンドラをModelAdminに添付します。このような何か:

    ​​
    0

    私はこれはかなり古いですが実現し、これを検索するときに、これはまだ最初の結果です。

    django-admin-genericfkあなたが必要とするのは正確です。

    0

    django-admin-genericfkはDjango 1.9では動作しません。

    それ以外

    私は、次のモジュールが見つかりました:

    https://github.com/lexich/genericrelationview

    よく維持に見えています。残念ながら、そのJSコードはDjango CMSがjQuery(noConflict jQuery)を設定する方法とうまく動作しません。したがって、それは私の選択肢ではないようです。しかし、Django CMSのページではなく、通常のDjango Adminで使用されていれば問題ありません。