2012-07-23 2 views
0

저는 제품 구조, AppMedia 모델 및 ProductMedia 조인 표가있는 간단한 구조입니다.Django 관리자는 외래 키의 이미지 필드의 축소판을 인라인 형식으로 표시합니다.

제품 ProductMedia

ProductMedia (많은이있다) (이 하나) AppMedia

내가 좋아 정말 할 것은 제품의 인라인 형태로 AppMedia의 미디어 필드의 축소판을 보는 것입니다.

Django admin에서 제품을 편집하면 StackedInline 양식이 표시됩니다. 여기에는 (현재) 모든 AppMedia의 드롭 다운 (선택)이 포함됩니다.

내가 필요한 것은 미리보기입니다.

도움을 주시면 감사하겠습니다.

나는 이것이 어렵지 않다는 것을 확신하지만, 나는 고심하고있다. AppMedia 양식 (미디어 ImageField가 상주하는 곳)에 미리보기 이미지를 넣는 것은 매우 간단합니다. 그러나 AppMedia를 ForeignKey로 사용하는 ProductMedia 양식에는 사용하지 마십시오. AppMedia 이런 방식으로 공유

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) 

기본 모델 ... 이미지와 함께 (여기에 표시되지 않음) 추가 메타 데이터를 저장하는 동일한 파일의 여러 업로드를 중지합니다.

답변

-1

당신은에 ProductMedia 모델을 변경 한 경우에는, 반대로 예를 ProductMedia에 액세스 할 수 있습니다 외래 키에 대한 related_name 매개 변수로 보일 것입니다 : 당신은 제품의 미디어 개체에 액세스 할 수

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을 넣었습니다) 할 것이다 : 당신의 admin.py 넣어에서 다음

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

:

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

+0

이제 OK가됩니다 – Parham

+0

이 솔루션을 사용하면 모델이 관리 앱과 밀접하게 결합됩니다. – Dor

0

나는 동일한 문제가있었습니다. 나는 나의 시도 중 하나 이상이 귀하의 경우에 사용할 수있을 것입니다 희망 : 썸네일이 있어야 할 곳에

  • 인라인 관리에 form 속성을 설정 : (ForeignKeyRawIdWidget를 무시하지 않고)이 문제를 해결하기 위해 내 첫 번째 시도가 있었다

  • 내가이 솔루션을 포기하지만 나는 thumbn에 대한 데이터를 삽입 할 필요가 생각하기 때문에 썸네일

를 표시하는 위젯 주어진 폼 클래스에 다른 필드를 추가하여 표시 양식의 생성자에서 주어진 필드에 ail 및 나는 그것을 좋은 해결책으로 생각하지 않습니다.

내 다음 해결책은 일부 필드에 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 상속 및 이미지 썸네일 표시하려면이 방법 오버라이드 (override) :이 하다니

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)