在Django中,要实现自定义管理表单中多对多的“绿色加号”功能,你需要定义一个`ModelAdmin`的子类,并在其中覆盖`get_formset`方法。这个方法允许你控制如何生成表单集以及表单集中的每个字段的外观和行为。
下面是一个详细的步骤和代码示例:
1. 首先,定义你的模型和`admin.py`文件中的`ModelAdmin`子类:
```python
# models.py
from django.db import models
class MyModel(models.Model):
name = models.CharField(max_length=100)
related_models = models.ManyToManyField('RelatedModel')
# admin.py
from django.contrib import admin
from .models import MyModel
class RelatedModelInline(admin.TabularInline):
model = MyModel.related_models.through
extra = 0 # 这里设置为0,表示初始不显示“绿色加号”
class MyModelAdmin(admin.ModelAdmin):
inlines = [RelatedModelInline]
admin.site.register(MyModel, MyModelAdmin)
```
在这个例子中,我们定义了一个名为`MyModel`的模型,它有一个多对多字段`related_models`。我们还创建了一个`RelatedModelInline`类,用于在Django admin界面中显示这个多对多关系。
2. 接下来,你需要覆盖`get_formset`方法,以添加“绿色加号”功能:
```python
class MyModelAdmin(admin.ModelAdmin):
inlines = [RelatedModelInline]
def get_formset(self, request, obj=None, **kwargs):
formset = super().get_formset(request, obj, **kwargs)
# 添加“绿色加号”功能
for form in formset:
form.fields['related_models'].widget.can_add_related = True # 设置为True以启用“绿色加号”
return formset
```
在这段代码中,我们首先调用父类的`get_formset`方法来获取表单集。然后,遍历每一项表单,并设置其“相关对象字段”的 widget 的 `can_add_related` 属性为True。这会显示“绿色加号”,允许用户在表单中添加新的相关对象。
3. 最后,确保你的模型和`admin.py`文件都正确配置好了,然后在Django admin界面中查看`MyModel`。这时,“绿色加号”应该已经生效了。
测试用例:
1. 登录到Django admin界面。
2. 在`MyModel`管理页面上创建一个新的条目。
3. 在“相关对象字段”下,点击“绿色加号”,你应该能够看到一个模态窗口,允许你添加新的相关对象。