2011-07-14 16 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

相关问题