2012-07-23 41 views
0

我有一個簡單的結構,產品模型,AppMedia模型和ProductMedia連接表。Django Admin以嵌入形式顯示外鍵的imagefield的縮略圖

產品(有很多)ProductMedia

ProductMedia(有)AppMedia

我真的想是看到AppMedia媒體領域的縮略圖在產品內嵌形式。

例如編輯Django admin中的產品,顯示一個StackedInline表單。這包含(目前)下拉(選擇)所有AppMedia。

我需要的是縮略圖。

任何幫助表示讚賞。

我確定這不難,但我很掙扎。爲AppMedia表單(這是媒體ImageField所在的位置)放置縮略圖非常簡單,但不適用於將AppMedia用作ForeignKey的ProductMedia表單。

基本模型......

class Product(models.Model): 
    name    = models.CharField(max_length=100) 

class AppMedia(models.Model): 
    media   = models.ImageField(upload_to=appmedia_upload_to) #appmedia_upload_to defined elsewhere) 

class ProductMedia(models.Model): 
    title   = models.CharField(max_length=150) 
    media   = models.ForeignKey(AppMedia) 
    media_order  = models.IntegerField(default=0) 
    product   = models.ForeignKey(Product) 

的AppMedia以這種方式共享停止同一文件的多個上傳並存儲額外的元數據(這裏不顯示)與圖像。

回答

-1

你應該看看related_name參數外鍵,這將允許您訪問ProductMedia相反,也就是說,如果你改變了ProductMedia模式:

class ProductMedia(models.Model): 
    title   = models.CharField(max_length=150) 
    media   = models.ForeignKey(AppMedia) 
    media_order  = models.IntegerField(default=0) 
    product   = models.ForeignKey(Product, related_name='media') 

你可以訪問產品的媒體對象模型,它可以讓你把它放在你的管理員聯機表格中。即你必須(對一個更簡單的解釋,我已經把ProductMedia中的ImageField):

class Product(models.Model): 
    name    = models.CharField(max_length=100) 

    def admin_image(self): 
     return '<img src="%s"/>' % (self.media.all()[0].image.url) 
    admin_image.allow_tags = True 

class ProductMedia(models.Model): 
    title   = models.CharField(max_length=150) 
    image   = models.ImageField(upload_to=appmedia_upload_to) #appmedia_upload_to defined elsewhere) 
    media_order  = models.IntegerField(default=0) 
    product   = models.ForeignKey(Product, related_name='media') 

然後在您的admin.py地說:

class ProductAdmin(admin.ModelAdmin): 
    list_display = ('name', 'admin_image') 

admin.site.register(models.Product, ProductAdmin) 

https://docs.djangoproject.com/en/dev/ref/models/fields/#django.db.models.ForeignKey.related_name

希望我理解你的問題正確並且有所幫助。此外代碼沒有測試,但我很確定它應該工作。

+0

這句話雖然從理論上回答這個問題,我們希望你能包括在你的答案鏈接的文章的主要部分,並提供[鏈接以供參考](http://meta.stackexchange.com/q/8259)。如果做不到這一點,答案就會受到鏈接腐敗的威脅。 – Kev 2012-09-29 14:49:11

+0

好的,現在就可以做到 – Parham 2012-09-29 17:23:56

+0

這個解決方案使得該模型與管理應用程序緊密結合。 – Dor 2014-05-14 05:53:58

0

我有同樣的問題。我希望我的嘗試至少一個將是你的情況下可用:

我首先要解決這個問題(沒有覆蓋ForeignKeyRawIdWidget)的嘗試是:

  • 設置form財產直列管理員那裏縮略圖應顯示的
  • 添加一個字段與小部件給出窗體類,這將顯示縮略圖

但是我放棄了這個方案,因爲我覺得我有注資約thumbn數據在表單的構造函數中進入給定的字段,我不認爲這是一個很好的解決方案。

我的下一個解決方案是在某些領域使用MultiWidget。在這種情況下,我不需要添加另一個字段來形成,而且我將獲得在小部件中顯示縮略圖所需的數據,而無需在構造函數中注入它們。

class ThumbnailMultiWidget(MultiWidget): 

    def decompress(self, value): 
     #has to be overriden 
     return [None,None] 


class ThumbnailWidget(Widget): 

    def render(self, name, value, attrs=None): 
     #not quite sure what is in `value`, I've not been so far 
     return '<img src="%s"/>' % value.url 


class PhotoInlineForm(forms.ModelForm): 


    def __init__(self, *args, **kwargs): 
     super(PhotoInlineForm, self).__init__(*args, **kwargs) 


     wdgts = [self.fields['media'].widget, ThumbnailWidget()] 
     self.fields['media'].widget = ThumbnailMultiWidget(widgets=wdgts) 


    class Meta: 
     model = RecipePhoto 

但我放棄了這種解決方案爲好,因爲我發現,實際上有一個實例的表示在ForeignKeyRawIdWidget(這是小部件我使用)與我需要顯示縮略圖的所有數據。這是我最後的解決辦法:

所以,因爲我的內聯項目具有raw_id_field爲選擇一個內嵌的記錄,我可以簡單地重寫方法label_for_valueForeignKeyRawIdWidget,它是用來表示現有的在線紀錄。通常是__unicode__(我認爲)。我繼承ForeignKeyRawIdWidget和重寫這個方法來顯示圖像縮略圖:

class PhotoForeignKeyRawIdWidget(ForeignKeyRawIdWidget): 

    def label_for_value(self, value): 
     key = self.rel.get_related_field().name 
     try: 
      obj = self.rel.to._default_manager.using(self.db).get(**{key: value}) 
     except (ValueError, self.rel.to.DoesNotExist): 
      return '' 
     else: 
      """ 
      there's utilized sorl.thumbnail, but you can return st like this: 
      <img src='%s' /> % obj.media.url 
      """ 
      return Template("""{% load thumbnail %} 
      {% thumbnail image.image "120x120" crop="center" as one %} 
       <img src="{{ one.url }}" /> 
      {% endthumbnail %}""").render(Context({ 
       'image': obj 
      })) 


class AppMediaInlineAdmin(admin.TabularInline): 
    model = AppMedia 
    extra = 1 

    def formfield_for_foreignkey(self, db_field, request=None, **kwargs): 
     if db_field.name == 'media': 
      db = kwargs.get('using') 
      kwargs['widget'] = PhotoForeignKeyRawIdWidget(db_field.rel, self.admin_site, using=db) 
     return super(AppMediaInlineAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs) 
相關問題