Зависимый выпадающий фильтр с Django и Ajax - PullRequest
0 голосов
/ 05 марта 2019

Я пытаюсь отфильтровать результаты базы данных из одной таблицы с несколькими зависимыми выпадающими меню. Вот что у меня так далеко.

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

<script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
<script>
    $("#id_gebaeudebereich").change(function () {
        var gebaeudebereich = $(this).val();

        $.ajax({
            data: {
                'gebaeudebereich': gebaeudebereich
            },
            success: function (data) {
                $('#id_gebaeudenummer').html(data);
            }
        });

    });
</script>

Я использую внешнюю библиотеку django_filter для фильтрации результатов базы данных. Вот мои filters.py

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

    entries = Excel3.objects.values_list('gebaeudenummer', flat=True).distinct()
    gebaeudenummer_auswahl = [(e, e) for e in entries]
    gebaeudenummer = django_filters.ChoiceFilter(choices=gebaeudenummer_auswahl)

    entries = Excel3.objects.values_list('ebene', flat=True).distinct()
    ebene_auswahl = [(e, e) for e in entries]
    ebene = django_filters.ChoiceFilter(choices=ebene_auswahl)

    entries = Excel3.objects.values_list('raum', flat=True).distinct()
    raum_auswahl = [(e, e) for e in entries]
    raum = django_filters.ChoiceFilter(choices=raum_auswahl)

И, наконец, мои views.py

def filter(request):
    gb = request.GET.get("gebaeudebereich")
    entries = Excel3.objects.filter(gebaeudebereich=gb).values_list("gebaeudenummer", flat=True).distinct()
    gn = [(e) for e in entries]
    print(gn)
    instance = Excel3.objects.values()
    user_filter = CSVFilter(request.POST or None, queryset=instance)
    return render(request, 'music/filter.html', {'filter': user_filter, 'gn' : gn})

Когда я печатаю gn, он принадлежит значению, которое я выбрал в выпадающем меню. Но использование переменной в jquery не работает. Я пытался {{ gn }} заполнить второй выпадающий фильтр, но он пуст.

Функция изменения в шаблоне работает, поэтому, когда я выбираю значение "id_gebaeudebereich", во втором раскрывающемся списке что-то меняется с помощью "id_gebaeudenummer". Однако ничего не отображается, и потому что у меня нет отношения ForeignKey между значениями. Учебники и то, что я не нашел, не могут быть применены к моей проблеме. Чтобы отфильтровать результаты, путь Django будет:

Model.objects.filter(gebaeudebereich = "selected value in the first dropdown").values_list("gebaeudenummer", flat= True).distinct()

И в SQL:

SELECT gebaeudenummer FROM db_table WHERE gebaeudebereich = "selected value"

Так что есть способ отфильтровать базу данных с помощью jquery в моем шаблоне. Так что отображать только значения принадлежности во втором раскрывающемся списке. Или мне нужно изменить представление для отправки различных данных в шаблон.

Любая помощь будет принята с благодарностью. Я застрял с этой проблемой слишком долго.

...