【问题标题】:How do I reuse single model field validators for forms without using ModelForm?如何在不使用 ModelForm 的情况下为表单重用单个模型字段验证器?
【发布时间】:2018-09-30 14:02:29
【问题描述】:

创建表单时如何重用模型字段验证器。我不能使用 ModelForm,因为表单只使用了模型的部分字段,而且我还有其他表单字段。

小例子

我有一个长度始终为 32 个字符的(加密)密钥模型,我想在模型和接受该密钥的表单中使用此限制。

models.py

class EncryptionKey(models.Model)
    key = models.CharField("Encryption Key", max_length=32, validators=[validators.MinLengthValidator(32)])

forms.py

class NewUserForm(forms.Form):
    first_name = forms.CharField(label='First Name', required=True, max_length=256)
    last_name = forms.CharField(label='Last Name', required=True, max_length=256)
    key = # How do I reuse the key from the model here?

我正在寻找一种在 Django 2.1 中执行此操作的惯用方式。

我花了 20 分钟在谷歌上搜索,但我发现的只是如何使用 ModelForm。

【问题讨论】:

    标签: django python-3.x


    【解决方案1】:

    不确定它是否是惯用的,但您可以使用来自django.forms.modelsfields_for_model 助手:

    from django.forms.models import fields_for_model
    
    from yourapp.models import EncryptionKey
    
    
    class NewUserForm(forms.Form):
        first_name = forms.CharField(label='First Name', required=True, max_length=256)
        last_name = forms.CharField(label='Last Name', required=True, max_length=256)
        key = fields_for_model(EncryptionKey, ['key'])['key']
    

    我什至不确定这是否记录在案。

    【讨论】:

      【解决方案2】:

      我想我在Django docs for Models(强调我的)中找到了“规范”答案:

      抽象基类

      抽象基类在你想把一些常见的 信息转化为许多其他模型。你写你的基类 并将abstract=True 放在 Meta 类中。那么这个模型就不会 用于创建任何数据库表。相反,当它被用作基础时 其他模型的类,其字段将添加到子模型的字段中 类。

      一个例子:

      from django.db import models
      
      class CommonInfo(models.Model):
          name = models.CharField(max_length=100)
          age = models.PositiveIntegerField()
      
          class Meta:
              abstract = True
      
      class Student(CommonInfo):
          home_group = models.CharField(max_length=5)
      

      Student 模型将包含三个字段:nameagehome_groupCommonInfo 模型不能用作普通的 Django 模型,因为它 是一个抽象基类。它不生成数据库表或 有管理器,不能直接实例化或保存。

      从抽象基类继承的字段可以用 另一个字段或值,或使用None 删除。

      对于许多用途,这种类型的模型继承将正是您所需要的 想要。它提供了一种在 Python 中提取常见信息的方法 level,同时仍然为每个子模型创建一个数据库表 数据库级别。

      我可以看到的唯一缺点是继承用于“has-a”关系而不是“is-a”。按照上面的例子:学生被建模为公共信息的专业化,但显然不是。

      【讨论】:

        猜你喜欢
        • 2023-02-12
        • 1970-01-01
        • 1970-01-01
        • 2019-12-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-05
        • 1970-01-01
        相关资源
        最近更新 更多