使用EmailField代替ChoiceField和表单

时间:2014-07-01 19:49:42

标签: django django-forms

我有分类和电子邮件模型:

class EmailAddress(models.Model):
    address = models.EmailField(unique=True)

class Classified(models.Model):
    title = models.CharField(...)
    contact_email = models.ForeignKey(EmailAddress)

在表单中,我希望用户使用常规电子邮件地址来输入电子邮件地址。如果找不到地址,则创建并将其保存到数据库。我在这里归档了这个:

class CreateClassifiedForm(forms.ModelForm):
    contact_email = EmailField(label=_('Contact Email'))

    class Meta:
        model = Classified
        fields = ['category', 'title', 'contact_email',
                  'contact_email_visible', 'contact_email_proxied', 'desc']

    def save(self, *args, **kwargs):
        self.cleaned_data['contact_email'] = \
            EmailAddress.objects.get_or_create(
                address=self.cleaned_data['contact_email'])[0]
        clsfd = Classified(**self.cleaned_data)
        clsfd.save()
        return clsfd

但是当我调用此表单的is_valid()方法时,我收到错误:

Cannot assign "u'foo@foo.com'": "Classified.contact_email" must be a "EmailAddress" instance.

我认为is_valid方法尝试从给定字段实例化对象并失败。归档我正在尝试做的事情的最佳做法是什么?

1 个答案:

答案 0 :(得分:0)

你根本不应该在save中这样做。相反,覆盖clean_contact_email只是从get_or_create返回EmailAddress,并完全删除保存定义。