Фильтр Django Admin для другой модели внутри формы редактирования - PullRequest
0 голосов
/ 16 мая 2018

Я сталкиваюсь со следующей проблемой.
У меня есть 3 разные модели:
1.) Testsuite (который содержит список тестов)
2.) Test (которые имеют разные группы. Например, «production», «live», «frontend»,"backend" и т. д.)
3.) Группы (список всех доступных групп.

) Тестер должен создать набор тестов со списком тестов. Но добавлять их по одному не подходит.Лучшим вариантом является их массовая сортировка по группам.

Я ищу 2 решения. Включите опцию фильтра в форму редактирования.

enter image description hereЭтот фильтр здесь был бы хорош enter image description here

или другие параметры.

Горизонтальный список в форме редактирования может выполнять поиск тегов группы.

Некоторый код для лучшего понимания. В forms.py:

<code><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'
            )
        }

admin.py

<code><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']

и models.py

<code><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

1 Ответ

0 голосов
/ 16 мая 2018

Это было одно решение, которое я нашел.но это не работает от многих ко многим полям.

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 и там вы не можете фильтровать это.

...