【问题标题】:Django Admin filter for another model inside edit form编辑表单中另一个模型的 Django Admin 过滤器
【发布时间】:2018-10-26 06:58:12
【问题描述】:

我面临以下问题。
我有 3 种不同的型号:
1.) 测试套件(包含测试列表)
2.) 测试(有不同的组。例如“生产”、“直播”、“前端”、“后端”等)
3.) 组(所有可用组的列表。

测试人员需要创建一个包含测试列表的测试套件。 但是一一添加是不合适的。 更好的选择是按组批量添加它们。

我正在寻找 2 个解决方案。 在编辑表单中包含过滤器选项。

这里的过滤器会很好

或其他选项。

编辑表单中的横向列表 能够搜索组标签。

一些代码以获得更好的理解。 在forms.py中:

<pre>
class TestSuiteForm(forms.ModelForm):
    class Meta:
        model = TestSuiteModel
        fields = ('name','testcases' , 'nutzer' )
        widgets = {
            'testcases': autocomplete.ModelSelect2Multiple(
                'Testcase_autocomplete'
            )
        }

class TestCaseForm(forms.ModelForm):
    class Meta:
        model = TestCaseModel
        fields = ('name',  'testsuite' , 'gruppen' , 'portal' )
        widgets = {
            'testsuite': autocomplete.ModelSelect2Multiple(
                'Testsuite_autocomplete'
            ),

            'gruppen': autocomplete.ModelSelect2Multiple(
                'Gruppen_autocomplete'
            ),

        }


class GroupForm(forms.ModelForm):
    class Meta:
        model = GroupModel
        fields = ('name', 'testcases' )
        widgets = {
            'testcases': autocomplete.ModelSelect2Multiple(
                'Testcase_autocomplete'
            )
        }
</pre>

admin.py

<pre>

class TestSuiteFormAdmin(admin.ModelAdmin):
    search_fields = ('name',)
    form = TestSuiteForm
    list_filter = ['name']

class TestCaseAdmin(admin.ModelAdmin):
    form = TestCaseForm
    list_filter = ['gruppen', ]
    list_display = ['name', ]
    search_fields = ('name',)


class GroupAdmin(admin.ModelAdmin):
    form = GroupForm
    list_filter = ['name']
</pre>

和models.py

<pre>

class TestCaseModel(models.Model):
    #id = models.CharField(primary_key=True, max_length=50)
    name = models.CharField(max_length=50)
    gruppen =  models.ManyToManyField('GroupModel' , blank=True)
    testsuite = models.ManyToManyField('TestSuiteModel' , blank=True)

    def __str__(self):
        return self.name

    class Meta:
        db_table = "Testcase"
        verbose_name = 'Testcase'
        verbose_name_plural = 'Testcases'

@python_2_unicode_compatible
class TestSuiteModel(models.Model):
    name = models.CharField(max_length=200)
    testcases = models.ManyToManyField('TestCaseModel' , blank=True)
    nutzer = models.CharField(max_length=200,  blank=True)

    def __str__(self):
        return self.name

    class Meta:
        db_table = "Testsuite"
        verbose_name = 'Testsuite'
        verbose_name_plural = 'Testsuits'

class GroupModel(models.Model):
    name = models.CharField(max_length=50)
    testcases = models.ManyToManyField('TestCaseModel',  blank=True)


    def __str__(self):
        return self.name
</pre>

【问题讨论】:

    标签: python django django-admin django-admin-filters


    【解决方案1】:

    这是我找到的一种解决方案。但这不适用于多对多字段。

    from pprint import pprint
    from django.utils.encoding import smart_text
    from django.utils.translation import ugettext_lazy as _
    
    class CategoryListFilter(admin.SimpleListFilter):
    title = _('TestCaseModel')
    parameter_name = 'testcasemodel'
    
    def lookups(self, request, model_admin):
        categories = TestCaseModel.objects.all()
    
        for obj in categories:
            pprint(vars(obj))
        #filter_objects = TestCaseModel.objects.filter(Some_attribut = "some_name")
        #filter_objects = TestCaseModel.objects.filter(group = "backend")
    
    def queryset(self, request, queryset):
    
        if self.value():
            return queryset.filter(testcasemodel__id=self.value())
    
    class TAdmin(admin.ModelAdmin):      
        list_filter = (CategoryListFilter,)
    

    对于多对多关系,您会得到一个 none 值,并且您无法对其进行过滤。

    【讨论】:

      猜你喜欢
      • 2018-04-27
      • 1970-01-01
      • 2011-08-09
      • 2016-12-11
      • 2019-12-04
      • 2015-10-13
      • 1970-01-01
      • 2021-01-26
      • 2014-01-30
      相关资源
      最近更新 更多