怎么让Django在admin中添加staffinfo类时不需要填写birth属性,而是用id_card属性的第7~14位自动填充birth信息?
时间: 2024-03-27 07:40:53 浏览: 49
可以通过重写`ModelAdmin`中的`save_model`方法实现这个需求。具体的代码实现如下:
```python
from django.contrib import admin
from .models import StaffInfo
class StaffInfoAdmin(admin.ModelAdmin):
# 定义需要显示的字段
list_display = ('id_card', 'name', 'birth')
def save_model(self, request, obj, form, change):
# 如果新建员工信息,且birth字段为空
if not change and not obj.birth:
# 提取身份证号的第7~14位作为生日
birth_str = obj.id_card[6:14]
# 将生日转换为datetime.date类型并赋值给birth字段
obj.birth = datetime.datetime.strptime(birth_str, '%Y%m%d').date()
# 调用父类的save_model方法保存对象
super().save_model(request, obj, form, change)
admin.site.register(StaffInfo, StaffInfoAdmin)
```
在上述代码中,我们重写了`StaffInfoAdmin`类中的`save_model`方法。当我们在Django admin中添加或修改StaffInfo对象时,会调用此方法。在方法中,我们判断对象是否为新建对象(即`change=False`),并且对象的`birth`属性是否为空。如果是的话,就可以从对象的`id_card`属性中提取出生年月日信息,并将其转换为`datetime.date`类型,最后赋值给`birth`属性。最后,调用父类的`save_model`方法保存对象即可。
需要注意的是,我们需要在`StaffInfoAdmin`类中定义`list_display`属性,将需要在Django admin中显示的字段列出来。在上述代码中,我们列出了`id_card`、`name`、`birth`三个字段。
阅读全文