【问题标题】:Django: How to handle User data validation the right way?Django:如何以正确的方式处理用户数据验证?
【发布时间】:2014-12-05 12:47:17
【问题描述】:

在我的应用中,我有一个自定义用户模型,其中包含性别、出生日期等额外字段。

我通常使用不同的方式创建/更新用户(REST API 中的 Web 服务、Django 表单),这意味着我不能依靠表单验证来验证用户数据。

这就是为什么我问自己如何使用户验证尽可能干净。

我决定通过覆盖 User 类中的 save() 方法来做到这一点:

def save(self, *args, **kwargs):

    # Will prevent from entering bad formated data.
    self.full_clean()

    # If birth_date provided, need to be younger than current date
    if self.birth_date and self.birth_date > datetime.now().date():
        raise EXC_FUT_DATE

    super(User, self).save(*args, **kwargs)
  • 我首先使用 full_clean() 方法检查提供的数据 符合用户字段要求(例如,性别需要是“M” 或“F”)
  • 我进行了额外的功能验证,例如:“出生日期是过去吗?”

它似乎按预期工作,但我不确定是否遵循此处的最佳做法。 整个目的是保持 DRY(在一个地方有验证逻辑),并且这个验证逻辑适用于用户创建/修改,无论它使用 Django 表单还是 web 服务。

对此模式有何评论?也许是其他想法?非常感谢。

【问题讨论】:

    标签: python django design-patterns django-users


    【解决方案1】:

    您可以使用 Django 表单,因为构造函数 args 是一个字典。 因此,使用从 API 捕获的值构建一个 dict,用它实例化表单并调用 is_valid() 方法。

    data = {'subject': 'hello',
            'message': 'Hi there',
            'sender': 'foo@example.com',
             'cc_myself': True}
    f = ContactForm(data)
    

    from docs

    【讨论】:

    • 假设我有一个包含所有模型属性的表单。目前不是我的情况。我应该创建一个模型表单吗? (例如class UserForm(ModelForm)?谢谢!
    • 是的,ModelForm 将进行验证。另外,不要忘记选择您要使用的字段,如documentation
    • 非常感谢。我从头重写了所有验证,它比在save() 中处理验证要干净得多。
    猜你喜欢
    • 2016-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-15
    • 1970-01-01
    • 1970-01-01
    • 2015-08-02
    相关资源
    最近更新 更多