定义一个Emergency类,并且有res_id和tel两个属性,其中的res_id是staffinfo类的外键,tel必须是11位的数字,在admin中staffinfo用inlines连接了emergency,如何在添加一个新的staffinfo的时候完成对emergency中tel数据的合法性检查?
时间: 2024-03-27 14:40:24 浏览: 56
首先,我们可以定义一个Emergency类如下:
```python
from django.db import models
from django.core.exceptions import ValidationError
from staff.models import StaffInfo
class Emergency(models.Model):
res_id = models.ForeignKey(StaffInfo, on_delete=models.CASCADE)
tel = models.CharField(max_length=11)
def clean(self):
if not self.tel.isdigit() or len(self.tel) != 11:
raise ValidationError('电话号码必须为11位数字!')
```
在这里,我们通过ForeignKey将Emergency和StaffInfo进行关联。然后,我们在Emergency类中定义了一个clean方法,用于完成对tel数据的合法性检查。在这个方法中,我们首先判断tel是否为数字,然后再判断tel的长度是否为11位,如果不是,就抛出一个ValidationError异常。
接下来,我们需要在admin.py文件中使用inlines将Emergency和StaffInfo连接起来,并且在添加一个新的staffinfo的时候完成对emergency中tel数据的合法性检查。我们可以按照如下方式来实现:
```python
from django.contrib import admin
from staff.models import StaffInfo
from emergency.models import Emergency
class EmergencyInline(admin.TabularInline):
model = Emergency
class StaffInfoAdmin(admin.ModelAdmin):
inlines = [EmergencyInline]
def save_model(self, request, obj, form, change):
if change:
obj.save()
else:
obj.full_clean()
obj.save()
admin.site.register(StaffInfo, StaffInfoAdmin)
```
在这里,我们首先定义了一个EmergencyInline类,并将其作为inlines参数传递给StaffInfoAdmin类。然后,我们重写了StaffInfoAdmin类的save_model方法,在这个方法中,我们首先判断obj是否为修改操作,如果是,就直接调用obj.save()方法保存数据;如果不是,就先调用obj.full_clean()方法进行数据合法性检查,然后再调用obj.save()方法保存数据。
这样,当我们在admin中添加一个新的staffinfo时,就会自动完成对emergency中tel数据的合法性检查了。
阅读全文