You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django Admin编辑表单中跨模型筛选方案咨询

解决方案:按分组批量添加测试用例到测试套件

针对你提出的两种需求,我基于现有Django + django-autocomplete-light(DAL)的代码结构,提供具体实现方案:


方案一:在编辑表单内添加分组筛选选项

这个方案会在测试套件编辑表单中新增一个分组选择控件,选择分组后自动过滤出对应测试用例,方便批量选择。

1. 修改表单,新增分组筛选字段

首先扩展TestSuiteForm,添加一个分组多选字段:

# forms.py
class TestSuiteForm(forms.ModelForm):
    # 新增分组筛选字段,用于过滤测试用例
    gruppen = forms.ModelMultipleChoiceField(
        queryset=GroupModel.objects.all(),
        required=False,
        widget=autocomplete.ModelSelect2Multiple('Gruppen_autocomplete'),
        label="按分组筛选测试用例"
    )

    class Meta:
        model = TestSuiteModel
        fields = ('name', 'gruppen', 'testcases', 'nutzer')  # 将新字段加入表单
        widgets = {
            'testcases': autocomplete.ModelSelect2Multiple('Testcase_autocomplete'),
        }

2. 扩展Autocomplete视图,支持分组过滤

修改测试用例的Autocomplete视图,使其能接收分组参数并过滤结果:

# views.py(假设你的Autocomplete视图在此文件)
from dal import autocomplete
from django.db.models import Q
from .models import TestCaseModel

class TestcaseAutocomplete(autocomplete.Select2QuerySetView):
    def get_queryset(self):
        if not self.request.user.is_authenticated:
            return TestCaseModel.objects.none()

        qs = TestCaseModel.objects.all()

        # 获取选中的分组ID,过滤测试用例
        gruppen_ids = self.request.GET.getlist('gruppen')
        if gruppen_ids:
            qs = qs.filter(gruppen__id__in=gruppen_ids)

        # 保留原有的名称搜索功能
        if self.q:
            qs = qs.filter(name__icontains=self.q)

        return qs.distinct()  # 去重避免重复结果

3. 添加JS联动逻辑

创建静态JS文件实现分组选择与测试用例列表的联动:

// static/admin/testsuite_filter.js
document.addEventListener('DOMContentLoaded', function() {
    const groupSelect = document.getElementById('id_gruppen');
    const testcaseSelect = document.getElementById('id_testcases');

    if (!groupSelect || !testcaseSelect) return;

    // 监听分组选择变化
    groupSelect.addEventListener('change', function() {
        const selectedIds = Array.from(this.selectedOptions).map(opt => opt.value);
        const autocompleteUrl = new URL(testcaseSelect.dataset.autocompleteUrl);
        
        // 更新URL中的分组参数
        autocompleteUrl.searchParams.delete('gruppen');
        selectedIds.forEach(id => autocompleteUrl.searchParams.append('gruppen', id));
        
        testcaseSelect.dataset.autocompleteUrl = autocompleteUrl.toString();
        
        // 清空当前选中的测试用例(可选,根据需求调整)
        $(testcaseSelect).trigger('select2:clear');
    });
});

在Admin类中引入这个JS文件:

# admin.py
class TestSuiteFormAdmin(admin.ModelAdmin):
    search_fields = ('name',)
    form = TestSuiteForm
    list_filter = ['name']
    
    class Media:
        js = ('admin/testsuite_filter.js',)

方案二:让测试用例选择列表支持按分组名称搜索

这个方案无需新增控件,直接扩展现有Autocomplete的搜索能力,让用户输入分组名称就能找到对应测试用例。

1. 修改Autocomplete视图,支持分组名称搜索

更新测试用例的Autocomplete视图,让搜索同时匹配测试用例名称和分组名称:

# views.py
class TestcaseAutocomplete(autocomplete.Select2QuerySetView):
    def get_queryset(self):
        if not self.request.user.is_authenticated:
            return TestCaseModel.objects.none()

        qs = TestCaseModel.objects.all()

        if self.q:
            # 同时匹配测试用例名称和所属分组名称
            qs = qs.filter(
                Q(name__icontains=self.q) | 
                Q(gruppen__name__icontains=self.q)
            )

        return qs.distinct()

2. 优化显示标签(可选)

为了让用户更直观地看到测试用例所属分组,修改测试用例模型的显示文本:

# models.py
class TestCaseModel(models.Model):
    # ... 原有字段 ...

    def get_autocomplete_label(self):
        group_names = ', '.join(g.name for g in self.gruppen.all())
        return f"{self.name} ({group_names})" if group_names else self.name

然后在Autocomplete视图中使用这个自定义标签:

# views.py
class TestcaseAutocomplete(autocomplete.Select2QuerySetView):
    # ... 原有代码 ...
    
    def get_result_label(self, item):
        return item.get_autocomplete_label()

注意事项

  • 确保已正确配置django-autocomplete-light(INSTALLED_APPS中添加dal和dal_select2)
  • 方案一的JS依赖jQuery,Django Admin默认已包含jQuery,无需额外引入
  • 两种方案可以同时使用,为用户提供更灵活的选择方式

内容的提问来源于stack exchange,提问作者Nils Zenker

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:23:36