【问题标题】:Django doesn't validate on create?Django 在创建时不验证?
【发布时间】:2016-07-28 15:04:29
【问题描述】:

是不是create函数没有按照模型规范验证?这是我的模型:

class Contact(models.Model):
    id = models.AutoField(primary_key=True)

    firstname = models.CharField(max_length=100, null=False, blank=False)
    lastname = models.CharField(max_length=100, null=False, blank=False)
    email = models.EmailField(max_length=150, blank=False, null=False)
    active = models.BooleanField(default=True)

我在我的view 中使用了这个功能:

new_contact = Contact.objects.create(firstname=a,
    lastname=b,
    email=c)
# where a, b, & c are empty strings in request.POST, which shouldn't validate

对create 的调用没有问题。但是,情况不应该如此。该模型根据需要指定这些字段。事实上,如果我去管理面板查看这个对象,我无法保存它(不做任何更改),因为它对我大喊说这些字段是必需的。

create 不验证是正常行为吗?

如何强制验证?

【问题讨论】:

  • @e4c5 是的,我创建了一个表单,但这并没有解决我的问题。在这一点上,我只是在一个视图中接受几种形式。它强制用户进行页面刷新只是为了向正在创建的主模型添加辅助信息,我不喜欢。

标签: django validation


【解决方案1】:

来自Django的doc,它说您需要显式调用模型验证相关的方法,即full_clean, clean,才能使模型验证生效。

您可以按照 Django documentation 中提供的示例在模型中实现您自己的验证序列。

【讨论】:

  • 链接失效
【解决方案2】:

您正在混淆表单和模型。

Field.blank

如果为 True,则该字段允许为空。默认为 False。

请注意,这与 null 不同。 null 纯粹是 与数据库相关,而空白与验证相关。如果一个字段有 空白=真,表单验证将允许输入空值。如果一个 字段有空白=假,该字段将是必需的。

所以是的,模型不关心空白验证是正常行为。

如果您想确保用户输入的空格不会出现在数据库中,您应该为此使用ModelForm。最un-django喜欢直接使用request.POST

【讨论】:

  • 正确。在我的情况下,正在创建的这个对象与正在提交的主表单是异步的,并且只是有条件地需要。我没有为此模型定义的表单。
  • 猜猜你现在必须创建一个或使用模型工厂
【解决方案3】:
  1. 设置blank=False 是一项验证要求,而不是数据库约束。
  2. 致电create、save 等不会为您检查验证。

您需要通过调用contact.full_clean() 自行执行验证

来自文档:

请注意,当您调用模型的 save() 方法时,不会自动调用 full_clean()。当您想为自己手动创建的模型运行一步模型验证时,您需要手动调用它。

https://docs.djangoproject.com/en/3.1/ref/models/instances/#validating-objects

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-04
    • 1970-01-01
    • 2019-06-27
    • 2020-08-25
    • 1970-01-01
    • 1970-01-01
    • 2016-01-26
    • 1970-01-01
    相关资源
    最近更新 更多