在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.SubfieldBase
在django documentation for custom model fields
的解释然而,这只是一个野生猜测Django的的FileField或ImageField的不设置要么。
你能提供一些示例代码与此? – armonge
那么看看上面的编辑,不要怪我,如果它失败:O –
不工作,发送方法不会让我包括一个实例参数,接收器装饰器需要一个kwargs参数。 – armonge