Django Многоступенчатый FilterSet - PullRequest
0 голосов
/ 22 февраля 2019

Есть ли способ динамически использовать django FilterSet из библиотеки django_filters, чтобы второй раскрывающийся список зависел от первого, третий - от первого и второго и т. Д.Допустим, у меня есть следующий models.py:

class CSV4(models.Model):
    var1 = models.CharField(max_length=100)
    var2 = models.CharField(max_length=100)
    var3 = models.CharField(max_length=100)
    var4 = models.CharField(max_length=100)
    var5 = models.CharField(max_length=100)
    var6 = models.CharField(max_length=100)
    var7 = models.CharField(max_length=100)
    var8 = models.CharField(max_length=100)
    var9 = models.CharField(max_length=100)

class CSVFilter(django_filters.FilterSet):
    entries = CSV5.objects.values_list('val1', flat = True).distinct()
    val1_choice = [(e, e) for e in entries]
    #print("e" , val1_choice)
    val1 = django_filters.ChoiceFilter(choices = val1_choice)

    entries = CSV5.objects.values_list('val2', flat=True).distinct()
    val2_choice= [(e, e) for e in entries]
    val2= django_filters.ChoiceFilter(choices=val2_choice)

    entries = CSV5.objects.values_list('val3', flat=True).distinct()
    val3_choice= [(e, e) for e in entries]
    val3= django_filters.ChoiceFilter(choices=val3_choice)

    entries = CSV5.objects.values_list('val4', flat=True).distinct()
    val4_choice = [(e, e) for e in entries]
    val4 = django_filters.ChoiceFilter(choices=val4_choice)

мой views.py

def filter_port(request):
    instance = CSV5.objects.values()
    user_filter = CSVFilter(request.POST or None, queryset=instance)

шаблон:

{% if user.is_authenticated %}

<form method="POST" id = "form1">
    {% csrf_token %}
    {{ filter.form }}
    <button name="filter_port" type="submit">Search</button>
</form>


<ul>
  {% for excel5 in filter.qs %}
        <li>
     {{ excel5.val5 }} - {{ excel5.val6 }} - {{ excel5.val7 }}
     - {{ excel5.val8 }} - {{ excel5.val9 }}


        <a href = "{% url 'appp:edit_results' excel5.id %}">
            <button>Edit</button>
        </a>

        </li>
  {% endfor %}
</ul>

{% endif %}
    return render(request, 'appp/filter_port.html', {'filter': user_filter})

Так что в основном я выбираю val1 ввыпадающий и получить только те значения поля val2, которое существует в базе данных, связанной с val1.

Пример:

Допустим, моя база данных выглядит следующим образом:

1,2,3,4
5,6,7,8
1,3,4,5
5,7,8,9

Iвыберите 1 в качестве val1 в первом раскрывающемся списке и теперь вместо 2,6,3 и 7 в качестве val2 (второй раскрывающийся список) я хотел бы отображать только значения 2 и 3, поскольку они «принадлежат» значению 1. НадеюсьПонятно, что мне нужно.Любая помощь будет оценена.

...