2012-12-17 76 views
8

比方說,我有一個Post對象,可以包含圖像,視頻和其他媒體類型。我可以使用GenericForeignKey將它們鏈接在一起。喜歡的東西:GenericForeignKey和Django中的管理員

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') 

現在,我可以很容易地創建一個管理界面,如:

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] 

現在問題:)在管理員/,我可以很容易地創建一個新的帖子。對於這篇文章,我可以輕鬆添加更多的MediaObject。在面板中,我有一個下拉菜單來選擇類型(音頻,視頻,...),但我必須手動輸入我想與Post鏈接的對象的ID。

我嘗試過各種擴展,包括grappelli。有些提供了查找這些鏈接的對象的能力。我希望能夠在這裏添加對象,例如添加一個AudioMedia,一個VideoMedia,一個ImageMedia,這取決於我從下拉列表中選擇什麼。

有什麼建議嗎?

+0

我還沒有嘗試過,但一個想法 - 你能不能有一個管理表單,並且該表單覆蓋'object_id'的默認文本框是一個'ModelChoiceField'? – karthikr

回答

4

你需要做相當多的工作才能實現這一目標。

  • 您要求管理員根據從下拉列表中選擇的模型類型,動態顯示模型表單。
  • Django的管理員沒有這樣做(也沒有做任何已知的擴展)。

爲了使這項工作,你必須:

  1. 編寫自定義JavaScript事件處理程序捕獲模式選擇降的下來電平變化。
  2. 然後調用Django的管理員並請求該模型的內聯模型。
  3. 使用該模型窗體更新當前HTML頁面。
  4. 然後,您需要攔截父模型的modelform的save()方法,以確定它處理的是哪個子模型,並將其正確保存到數據庫中。
  5. 然後,您需要理清如何獲得父模型的模型,以便根據子模型正確顯示適當的子模型的模型表單。

聽起來令人畏縮?它是。

這裏有一個更簡單的方法:

只有一個「媒體」模型。你會在模型上有幾個只對你的類型有效的字段(儘管有很多交叉)。

命名特定於具有該媒體類型前綴的單個媒體類型的任何字段,即image_size', or video_title`。

將JavaScript處理程序附加到您的ModelAdmin中,該處理程序根據媒體類型的下拉列表選擇性地顯示和隱藏字段。這樣的事情:

​​
0

django-admin-genericfk不支持Django 1.9。

除此之外,我只發現了以下模塊:

https://github.com/lexich/genericrelationview

看起來良好的維護。不幸的是,它的JS代碼與Django CMS如何設置jQuery(noConflict jQuery)並不一致,所以它似乎不適合我。但它應該沒問題,如果不是在Django CMS頁面中使用,而是使用常規的Django Admin。