我写了下述代码用于检查紧急联系人的电话号码是否合法,但是在我在admin中为一个员工添加一个紧急联系人时,他不会报错,感觉是因为外键连接的某种原因导致了无法进行跨表检查合法性,我需要怎么修改?class EmergencyAdmin(admin.ModelAdmin): list_display = ['staff_name', 'name', 'tel'] search_fields = ['res_id__NAME',] # 找到外键对应的表中的属性 def staff_name(self, obj): return obj.res_id.NAME # 将这个属性的标题行进行重命名 staff_name.short_description = '员工姓名' 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
时间: 2024-03-27 10:39:47 浏览: 62
您可以在 EmergencyAdmin 类中添加一个 `formfield_for_foreignkey` 方法,用于检查紧急联系人是否属于该员工。需要注意的是,您需要确保该员工已经存在于数据库中,否则会出现 IntegrityError。以下是修改后的代码:
```python
from django.core.exceptions import ValidationError
class EmergencyAdmin(admin.ModelAdmin):
list_display = ['staff_name', 'name', 'tel']
search_fields = ['res_id__NAME',]
# 找到外键对应的表中的属性
def staff_name(self, obj):
return obj.res_id.NAME
# 将这个属性的标题行进行重命名
staff_name.short_description = '员工姓名'
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
def formfield_for_foreignkey(self, db_field, request, **kwargs):
formfield = super().formfield_for_foreignkey(db_field, request, **kwargs)
# 紧急联系人必须属于该员工
if db_field.name == 'res_id':
formfield.queryset = formfield.queryset.filter(staff=request.obj.staff)
return formfield
```
在 `formfield_for_foreignkey` 方法中,我们首先调用父类的方法以获取默认的表单字段,然后再将其限制为仅包含属于该员工的紧急联系人。需要注意的是,我们使用 `request.obj` 来获取当前正在编辑的员工对象,这个属性需要在 `get_form` 方法中设置:
```python
class EmergencyAdmin(admin.ModelAdmin):
# ...
def get_form(self, request, obj=None, **kwargs):
request.obj = obj
return super().get_form(request, obj, **kwargs)
```
这样就能够在添加紧急联系人时检查其合法性并确保其属于正确的员工了。
阅读全文