首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django管理有效表单,功能干净

Django管理有效表单,功能干净
EN

Stack Overflow用户
提问于 2022-08-12 12:45:34
回答 1查看 43关注 0票数 0

在django模型中,我定义了一个clean函数,用于在保存数据之前验证附加条件。

这是我的模型:

代码语言:javascript
复制
class TestRange(models.Model):
    SERVICE = [
        ('s1', 'Service 1'),
        ('s2', 'Service 2')
    ]

    service = models.CharField(max_length=2, choices=SERVICE)
    SDA = [
        (False, 'NO SDA'),
        (True, 'SDA')
    ]
    sda = models.BooleanField(choices=SDA)
    number_start = models.CharField(max_length=10, validators=[valide_phone_number])
    number_end = models.CharField(max_length=10, validators=[valide_phone_number])

    def clean(self):
        if int(self.number_end) < int(self.number_start):
            raise ValidationError({'number_end': _("The end number must be greater than or equal to the start number")})
        if self.sda and len(self.number_start)!=10:
            raise ValidationError({'number_start': _("A SDA number consists of 10 digits")})
        super(TestRange, self).clean()

由于这个函数的定义--管理表单的默认验证不再有效--我不再需要在注册前检查表单的字段。

所以我收到了一条错误消息:

代码语言:javascript
复制
invalid literal for int() with base 10: ''

Request Method:     POST
Request URL:    http://127.0.0.1:8000/admin/gestnum/testrange/add/
Django Version:     4.1
Exception Type:     ValueError
Exception Value:    

invalid literal for int() with base 10: ''

Exception Location:     C:\Users\user\Documents\DEV\test\test\models\TestRange.py, line 25, in clean
Raised during:  django.contrib.admin.options.add_view
Python Executable:  C:\Users\user\Documents\DEV\test\.venv\Scripts\python.exe
Python Version:     3.9.6

如何继续保持默认验证并添加我的附加验证

不具备以下功能:

defaut验证管理员

您有没有定义新表单的解决方案吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-08-12 13:10:50

尝试以这样的方式定义您的干净方法:

代码语言:javascript
复制
    def clean(self):
        number_start = int(self.number_start) if self.number_start.isnumeric() else 0
        number_end = int(self.number_end) if self.number_end.isnumeric() else 0
        if number_end < number_start:
            raise ValidationError({'number_end': _("The end number must be greater than or equal to the start number")})
        if self.sda and len(f'{number_start}') != 10:
            raise ValidationError({'number_start': _("A SDA number consists of 10 digits")})
        super().clean()

当您使用管理面板输入数据时,self.number_startself.number_end字段可能是空的,因为没有使用任何整数值填充它们。另外,我认为number_startnumber_end字段应该是IntegerField类型,这样就不存在这个问题了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73334412

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档