0

models.ForeignKey のサブクラスがあります。その唯一の目的は、カスタム ウィジェットを使用することです。

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 を指定したにもかかわらず、生成されたフォームのラベルは「Image」になり、空の値を指定しようとすると、blank=True を使用してもエラーが発生します

4

1 に答える 1

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。そうしないと、フォームが空白の値を受け入れても、データベースはそれを拒否します。nullまた、実行後の値を変更するにsyncdbは、データベースの移行が必要であることに注意してください。

于 2012-04-12T17:19:48.013 に答える