2011-07-14 15 views
3

在Django中,我有一個模型表示具有外鍵給另一個模型的描述的圖像,此模型使用StdImageField來保存圖像並自動創建縮略圖。該模型還有一個選擇域,其中有兩個選項代表圖像的類型。Django StdImage在使用代理模型時不起作用

在我的管理員中,我將這個模型顯示爲主模型的內聯,但是我想在管理員中將此模型顯示爲兩個單獨的內聯,就好像它們是兩個單獨的對象類型,我正在使用2個代理模型並註冊它們。

問題是,當我使用這個代理模型的StdImageField不會調整上傳的圖像,也不創建縮略圖。我相信這是由於問題描述here

我的代碼爲以下(精簡爲目的):從Django中

models.py

from django.db import models 
from stdimage import StdImageField 

class MainModel(models.Model): 
    some_field = models.CharField(max_length = 2) 

class SomeModel(models.Model): 
    SOME_MODEL_TYPE_CHOICES = (
      ('t1','Type 1'), 
      ('t2','Type 2'), 
    ) 
    main_model = models.ForeignKey(to='MainModel') 
    pic = StdImageField(upload_to='img', size =(200,200), thumbnail_size = (100,100)) 
    pic_type = models.CharField(max_length = 2, choices = SOME_MODEL_TYPE_CHOICES) 


class SomeModelT1Manager(models.Manager): 
    def get_query_set(self): 
     return super(SomeModelT1Manager, self).get_query_set().filter(pic_type='t1') 

class SomeModelT1(SomeModel): 
    objects = SomeModelT1Manager() 

    class Meta: 
     proxy = True 

    def save(self, *args, **kwargs): 
     if not self.pk: 
      self.pic_type = 't1' 
     super(SomeModelT1, self).save(*args,**kwargs) 

class SomeModelT2Manager(models.Manager): 
    def get_query_set(self): 
     return super(SomeModelT2Manager, self).get_query_set().filter(pic_type = 't2') 

class SomeModelT2(SomeModel): 
    objects = SomeModelT2Manager() 
    class Meta: 
     proxy = True 

    def save(self, *args, **kwargs): 
     if not self.pk: 
      self.pic_type = 't2' 

     super(SomeModelT2, self).save(*args, **kwargs) 

admin.py

.contrib

import admin 
from test_app.models import * 

class SomeModelT1Inline(admin.StackedInline): 
    model = SomeModelT1 
    exclude = ('pic_type',) 

class SomeModelT2Inline(admin.StackedInline): 
    model = SomeModelT2 
    exclude = ('pic_type',) 

class MainModelAdmin(admin.ModelAdmin): 
    inlines = [ 
      SomeModelT1Inline, 
      SomeModelT2Inline 
      ] 

admin.site.register(MainModel, MainModelAdmin) 

所以我的問題是有沒有另一種做法,或者我如何糾正這個問題stdimage。我想這個問題可能是contribute_to_class不會被調用在StdImageField在代理方面時,主要是因爲__metaclass__未設置爲models.SubfieldBasedjango documentation for custom model fields

的解釋然而,這只是一個野生猜測Django的的FileField或ImageField的不設置要麼。

回答

0

沒有任何調試只是一個猜測:本StdImageFieldcontribute_to_class方法註冊爲原單SomeModelpost_init爲和post_save一些信號的監聽器。如果sender是代理模型,則這些處理程序不會被調用。

一個圍繞這個有點hackish的方式可以製作自己的信號接收器的代理模式,送出去的post_savepost_init信號與SomeModel發件人..

編輯:你可以嘗試把這個末你的models.py;這是相當黑客,可能會導致一些錯誤,如果你將不得不註冊不同的處理程序的原始模型和代理模型...

from django.db.models.signals import post_save, post_init 
from django.dispatch import receiver 

@receiver(post_save, sender=SomeModelT1) 
def post_save_handler(sender, instance, **kwargs): 
    post_save.send(sender=SomeModel, instance=instance, **kwargs) 

@receiver(post_init, sender=SomeModelT1) 
def post_init_handler(sender, instance, **kwargs): 
    post_init.send(sender=SomeModel, instance=instance, **kwargs) 
+0

你能提供一些示例代碼與此? – armonge

+0

那麼看看上面的編輯,不要怪我,如果它失敗:O –

+0

不工作,發送方法不會讓我包括一個實例參數,接收器裝飾器需要一個kwargs參數。 – armonge

相關問題