2012-04-12 5 views
0

に処理されていない私はmodels.ForeignKey、カスタムウィジェットを使用することとなっている唯一の目的のサブクラスを持っている:モデルフィールドをサブクラス化する場合は、__init __の引数は

from django.db import models 
from .models import Images 

class GAEImageField(models.ForeignKey): 
    def __init__(self, **kwargs): 
     super(GAEImageField, self).__init__(Images, **kwargs) 

    def formfield(self, *args, **kwargs): 
     field = forms.ModelChoiceField(self, widget=ImageUploadWidget, *args, **kwargs) 
     field.queryset = Images.objects.all() 
     return field 

私がしようとすると問題がありますこのフィールドを使用すると、__init__のパラメータは無視されます。私はこのモデルしようとした場合たとえば、:

class SomethingWithImage(models.Model): 
    name = models.CharField('Awesome name', max_length=64) 
    image = GAEImageField(verbose_name='Awesome image', blank=True) 

...私はverbose_nameを指定したにもかかわらず、生成されたフォーム上のラベルには、「イメージ」ともかかわらず、エラーが発生します空の値を指定しようとするだろうI空白を使用する=真

答えて

1

まあ、問題はあなたのformfieldメソッドです。たとえば、デフォルトのForeignKeyで使用されている実装を見ると、superが呼び出されます。

def formfield(self, **kwargs): 
    defaults = { 
     'widget': ImageUploadWidget, 
    } 
    defaults.update(kwargs) 
    return super(GAEImageField, self).formfield(**defaults) 

問題は、フォームフィールドはモデルフィールドから情報を抽出しないということです。フォームフィールドはモデルとは完全に独立して使用することができますが、必ずしもモデルフィールドでサポートする必要はありません。つまり、フィールドが必須であるかどうか、そのラベルなどのすべての設定が、コンストラクタにパラメータとして渡されなければならないということです。フォームフィールドの適切なインスタンスを作成するのはモデルフィールドの責任であり、すべての設定が含まれます。 django.db.models.fields.Field.formfieldの既定の実装は、通常、親のメソッドを呼び出す必要がある理由を処理します。

blankの問題については、null=Trueも設定してください。そうしないと、フォームで空白の値が受け入れられても、データベースはそれを拒否します。また、syncdbの実行後にnullの値を変更するには、データベースの移行が必要です。

関連する問題