如何重写formfield_for_dbfield,使得staffinfo 中的tel类必须是11位数字,否则在输入框上方弹出错误信息“请输入有效电话号码”
时间: 2024-03-27 07:36:39 浏览: 64
您可以在您的 ModelAdmin 类中重写 formfield_for_dbfield 方法,并针对 staffinfo 中的 tel 字段进行自定义表单控件的设置和错误消息的定义,示例代码如下:
```python
from django.contrib import admin
from django.forms import TextInput
from django.core.exceptions import ValidationError
from myapp.models import StaffInfo
class StaffInfoAdmin(admin.ModelAdmin):
def formfield_for_dbfield(self, db_field, **kwargs):
formfield = super().formfield_for_dbfield(db_field, **kwargs)
if db_field.name == 'tel' and isinstance(formfield.widget, TextInput):
def validate_tel(value):
if not value.isdigit() or len(value) != 11:
raise ValidationError('请输入有效电话号码')
formfield.widget.input_type = 'tel'
formfield.validators.append(validate_tel)
return formfield
admin.site.register(StaffInfo, StaffInfoAdmin)
```
上述示例代码中,我们首先导入了必要的模块,然后定义了一个名为 StaffInfoAdmin 的 ModelAdmin 类,并在其中重写了 formfield_for_dbfield 方法。在重写方法中,我们首先调用父类的方法获取原始的表单控件,然后判断当前字段是否为 staffinfo 中的 tel 字段,并且当前表单控件是否为 TextInput 类型。如果是,则定义一个名为 validate_tel 的函数来校验 tel 字段的输入值是否为 11 位数字,如果不是则抛出 ValidationError 异常。接着,我们将表单控件的 input_type 属性设置为 'tel',以便在移动设备上自动弹出数字键盘,并将 validate_tel 函数添加到 formfield 的 validators 列表中。最后,返回修改后的 formfield 对象即可。
这样,当您在 Django admin 后台管理界面中编辑 staffinfo 中的 tel 字段时,如果输入的内容不是 11 位数字,则会在输入框上方弹出错误信息“请输入有效电话号码”。
阅读全文