2011-07-14 11 views
3

Djangoでは、別のモデルへの外部キーを持つ説明付きのイメージを表すモデルがあります。このモデルはStdImageFieldを使用してイメージを保存し、サムネイルを自動作成します。このモデルには、画像のタイプを表す2つのオプションがある選択フィールドもあります。Django StdImageはプロキシモデルを使用しても動作しません

私の管理者はこのモデルをメインモデルのインラインとして示していますが、私はこのモデルを管理者の2つの別個のインラインとして表示したいと思います私は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

.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でこの問題を修正する方法私は、DjangoのFileFieldにかのImageFieldがないようしかし、それは唯一の野生の推測だ問題はdjango documentation for custom model fields

で説明したように__metaclass__models.SubfieldBaseに設定されていない主な理由は、ときにプロキシのコンテキストでcontribute_to_classがStdImageFieldで呼び出されることは決してありませんということができると思いどちらかを設定してください。任意のデバッグせずにただの推測

答えて

0

StdImageFieldさんcontribute_to_class方法はpost_initpost_saveためorginal SomeModelためのいくつかの信号のリスナーを登録します。 senderがプロキシモデルの場合、これらのハンドラは呼び出されません。この周り

1ビットハックの方法は...送信者としてSomeModelpost_savepost_init信号を送信し、プロキシモデルの

EDITを独自の信号受信機を作ることができます:あなたは最後にこれを入れてみてくださいあなたの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

sendメソッドはインスタンスパラメータを含むことができず、受信側デコレータにはkwargs引数が必要です。 – armonge