在Django中,我有一个模型,它代表一个具有外键到另一个模型的描述的图像,该模型使用StdImageField来保存图像并自动创建缩略图。该模型还有一个选项字段,其中有两个选项代表图像类型。
在我的管理员中,我将此模型显示为主模型的内联,但是我想将此模型显示为管理员中的两个单独的内联,就好像它们是用户的两个独立类型的对象,对于此使用2个代理模型并注册它们。
问题在于,当我使用此代理模型时,StdImageField不会调整上传图像的大小,也不会创建缩略图。我认为这是由于here
所述的问题我的代码如下(为此目的而剥离):
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)
来自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也没有设置。
答案 0 :(得分:0)
无需任何调试即可猜测:StdImageField
的{{1}}方法为contribute_to_class
和SomeModel
的原始post_init
注册了一些信号侦听器。如果post_save
是代理模型,则不会调用这些处理程序。
围绕这一点的一个有点hackish方法可能是为代理模型制作自己的信号接收器,发送sender
和post_save
信号post_init
作为发送方..
编辑:您可以尝试将其放在SomeModel
的末尾;如果您必须为原始模型和代理模型注册不同的处理程序,这可能会导致一些错误......
models.py