无法使用Django ModelForm进行模型绑定

1 投票
2 回答
1467 浏览
提问于 2025-04-17 16:04

假设我在Python中有一个模型类:

class Question(models.Model):
    title = models.CharField('Title', max_length=300)
    description = models.CharField('Description', max_length=800)
    publish_date = models.DateTimeField('Pulished Date')
    question_type = models.CharField(max_length=10)

我想把它和一个模型表单(ModelForm)绑定在一起:

class QuestionForm(ModelForm):
    class Meta:
        model = Question
        fields = ('title', 
              'description', 
              'publish_date', 
              'question_type')

当我在命令行中尝试创建一个对象时,出现了这个错误:

>>> form = QuestionForm()
>>> from django.utils import timezone
>>> form.publish_date = timezone.now().year
>>> form.save()
IntegrityError: (1048, "Column 'publish_date' cannot be null")

我是不是漏掉了什么?

2 个回答

0

你需要为你的表单或者字段添加验证

class Question(models.Model):
    title = models.CharField('Title', max_length=300)
    description = models.CharField('Description', max_length=800)
    publish_date = models.DateTimeField('Pulished Date', blank=False)
    question_type = models.CharField(max_length=10)

在上面的代码片段中,你可以通过使用 blank=False 来确保用户填写了 published_date。正如Daniel所提到的,在保存数据之前,你还需要调用 form.is_valid() 来检查数据是否有效。

2

嗯,是的:你完全没理解表单的目的。

仅仅手动给一个和模型属性同名的属性赋值是没有任何用的。这不是表单的工作方式。表单的工作原理是通过一个叫 data 的参数,这个参数是一个字典,用来把字段名和对应的值联系起来。然后你需要调用 form.is_valid() 来验证这些数据。只有在验证通过后,你才能调用 form.save() 来保存数据。

撰写回答