class EmergencyInline(admin.StackedInline): # 实现创建 StaffInfo 的同时创建 Emergency model = Emergency对于staffinfo有:class StaffInfoAdmin(admin.ModelAdmin): inlines = [EmergencyInline, BackgroundInline, WorkInline, FamilyInline] search_fields = ['NAME', 'RES_ID'] list_display = ['NAME', 'BIRTH', 'RES_ID'] list_filter = ['POST'] 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),如何添加一个功能能够使emergency中的tel属性的输入长度不为11位的数字时,在输入框上方进行错误提示?
时间: 2024-03-28 21:42:35 浏览: 88
您可以在EmergencyInline中的EmergencyForm中添加一个自定义的clean方法来验证输入的电话号码长度是否为11位,如果不是,可以通过raise ValidationError来触发错误提示。具体实现代码如下:
```
class EmergencyForm(forms.ModelForm):
class Meta:
model = Emergency
fields = '__all__'
def clean_tel(self):
tel = self.cleaned_data.get('tel')
if tel and (not tel.isdigit() or len(tel) != 11):
raise forms.ValidationError('请输入有效手机号码')
return tel
class EmergencyInline(admin.StackedInline):
model = Emergency
form = EmergencyForm
```
这样,当在后台创建或编辑StaffInfo时,如果输入的Emergency的tel属性长度不为11位的数字,就会在输入框上方显示错误提示信息。
相关问题
class StaffInfoAdmin(admin.ModelAdmin): inlines = [EmergencyInline, BackgroundInline, WorkInline, FamilyInline] search_fields = ['NAME', 'RES_ID'] list_display = ['NAME', 'BIRTH', 'RES_ID'] list_filter = ['POST'] # 生日自动填充,让其不可修改 readonly_fields = ['BIRTH','SEX',] class EmergencyInline(admin.StackedInline): # 实现创建 StaffInfo 的同时创建 Emergency # model 设置为 models.py 中的 Emergency,用于将 Emergency 连接至 StaffInfo model = Emergency # form 设置为 myforms.EmergencyForm,用于将输入时的错误提示等信息添加到 StaffInfo 连接的外表 form = myforms.EmergencyForm,这段代码在admin中时,如果是新添加的外键连接的emergency表,则可以直接点右侧的叉进行删除,而对于已有的外键连接的emergency表则需要勾选后再点删除,后者太麻烦了,我需要修改哪里才可以让admin中用inline连接的表emergency即使已经有数据也可以直接点击删除?
你可以在 `EmergencyInline` 类中添加 `extra` 属性,将其设置为 `0`,这样在创建 `StaffInfo` 的同时,不会自动创建多余的 `Emergency` 实例,而是在 `StaffInfo` 编辑页面中点击添加 `Emergency` 按钮才会创建新的 `Emergency` 实例。这样即使已经有数据也可以直接点击删除了。修改后的代码如下所示:
```
class EmergencyInline(admin.StackedInline):
model = Emergency
form = myforms.EmergencyForm
extra = 0 # 设置 extra 属性为 0,不会自动创建多余的 Emergency 实例
```
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)好像没起到自动填充BIRTH的作用,哪里出了问题?
根据您提供的代码,我暂时无法确定哪里出了问题。不过,您可以尝试以下几个方法来排查问题:
1. 检查是否在应用中正确添加了`StaffInfo`模型;
2. 检查是否在应用中正确导入了`datetime`模块;
3. 检查`StaffInfo`模型中的`birth`字段是否为空;
4. 在管理员界面中创建一个新的员工信息时,确保身份证号的第7~14位可以正确提取出生日。
如果您仍然无法解决问题,建议您提供更多的代码和错误信息,以便更好地定位问题。
阅读全文