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,但生成表单上的标签将是“图像”,即使我使用空白=真,尝试指定空值也会引发错误

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,否则即使表单接受空值,数据库也会拒绝它。另外,请注意修改nullafter的值syncdb已经运行需要数据库迁移。

于 2012-04-12T17:19:48.013 回答