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即使已经有数据也可以直接点击删除?
时间: 2024-03-29 16:40:01 浏览: 97
你可以在 `EmergencyInline` 类中添加 `extra` 属性,将其设置为 `0`,这样在创建 `StaffInfo` 的同时,不会自动创建多余的 `Emergency` 实例,而是在 `StaffInfo` 编辑页面中点击添加 `Emergency` 按钮才会创建新的 `Emergency` 实例。这样即使已经有数据也可以直接点击删除了。修改后的代码如下所示:
```
class EmergencyInline(admin.StackedInline):
model = Emergency
form = myforms.EmergencyForm
extra = 0 # 设置 extra 属性为 0,不会自动创建多余的 Emergency 实例
```
相关问题
class StaffInfoAdmin(admin.ModelAdmin): inlines = [EmergencyInline, BackgroundInline, WorkInline, FamilyInline] search_fields = ['NAME', 'RES_ID'] list_display = ['NAME', 'BIRTH', 'RES_ID'] list_filter = ['POST'] def clean_fields(self, request, obj): mobile_pattern = re.compile(r'^1[3456789]\d{9}$') if not re.match(mobile_pattern, obj.TEL): raise ValidationError("请输入11位电话号码,且不包含'-'") super().clean_fields(request, obj)代码如上,但是没有完成合法性检查的功能,电话号码输入123依旧可以提交数据
根据你提供的代码,可以看出在`clean_fields`函数中进行了电话号码的合法性检查,但是这个函数并没有被调用。为了实现这个功能,你需要在`save_model`函数中手动调用`clean_fields`函数。修改后的代码如下:
```
class StaffInfoAdmin(admin.ModelAdmin):
inlines = [EmergencyInline, BackgroundInline, WorkInline, FamilyInline]
search_fields = ['NAME', 'RES_ID']
list_display = ['NAME', 'BIRTH', 'RES_ID']
list_filter = ['POST']
def clean_fields(self, request, obj):
mobile_pattern = re.compile(r'^1[3456789]\d{9}$')
if not re.match(mobile_pattern, obj.TEL):
raise ValidationError("请输入11位电话号码,且不包含'-'")
super().clean_fields(request, obj)
def save_model(self, request, obj, form, change):
self.clean_fields(request, obj)
super().save_model(request, obj, form, change)
```
这样就可以在保存数据之前进行合法性检查了。
我的意思是对于有数据的emergency需要勾选后再删除很麻烦,在页面中他的代码是<span class="delete"><input type="checkbox" name="emergency_set-0-DELETE" id="id_emergency_set-0-DELETE"> <label class="vCheckboxLabel inline" for="id_emergency_set-0-DELETE">删除</label></span>,而我希望他变为可以直接删除的按钮,也就是这样的按钮:<span><a class="inline-deletelink" href="#">删除</a></span>
要实现这个功能,你需要在 `EmergencyInline` 类中添加 `can_delete` 属性并将其设置为 `False`,然后在 `StaffInfoAdmin` 类中重写 `delete_model` 方法,在其中设置 `can_delete` 为 `True`。这样当你在编辑 `StaffInfo` 页面时,已经存在的 `Emergency` 实例就可以直接通过点击 "删除" 按钮来删除了。修改后的代码如下所示:
```
class EmergencyInline(admin.StackedInline):
model = Emergency
form = myforms.EmergencyForm
extra = 0
can_delete = False # 设置 can_delete 属性为 False
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',]
def delete_model(self, request, obj):
obj.can_delete = True # 设置 can_delete 为 True
obj.delete()
# 确认删除时的提示信息
def delete_view(self, request, object_id, extra_context=None):
response = super().delete_view(request, object_id, extra_context)
if response.status_code == 302:
messages.warning(request, "删除成功!")
return response
```
这样修改后,编辑 `StaffInfo` 页面中的 "Emergency" 部分就会变成可以直接删除的按钮。需要注意的是,这个修改只会影响到 `EmergencyInline` 类中的删除按钮,如果你还有其他的 `Inline` 类需要同样的功能,也需要对这些类进行相应的修改。
阅读全文