使用代理模型时,Django StdImage将无法工作

时间:2011-07-14 04:46:13

标签: django django-models

在Django中,我有一个模型,它代表一个具有外键到另一个模型的描述的图像,该模型使用StdImageField来保存图像并自动创建缩略图。该模型还有一个选项字段,其中有两个选项代表图像类型。

在我的管理员中,我将此模型显示为主模型的内联,但是我想将此模型显示为管理员中的两个单独的内联,就好像它们是用户的两个独立类型的对象,对于此使用2个代理模型并注册它们。

问题在于,当我使用此代理模型时,StdImageField不会调整上传图像的大小,也不会创建缩略图。我认为这是由于here

所述的问题

我的代码如下(为此目的而剥离):

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

来自django.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.SubfieldBase,如django documentation for custom model fields中所述

然而,这只是一个疯狂的猜测,因为django的FileField或ImageField也没有设置。

1 个答案:

答案 0 :(得分:0)

无需任何调试即可猜测:StdImageField的{​​{1}}方法为contribute_to_classSomeModel的原始post_init注册了一些信号侦听器。如果post_save是代理模型,则不会调用这些处理程序。

围绕这一点的一个有点hackish方法可能是为代理模型制作自己的信号接收器,发送senderpost_save信号post_init作为发送方..

编辑:您可以尝试将其放在SomeModel的末尾;如果您必须为原始模型和代理模型注册不同的处理程序,这可能会导致一些错误......

models.py