Django和Ajax的从属下拉过滤器

时间:2019-03-05 12:54:16

标签: jquery ajax django django-filter django-filters

我正在尝试从具有多个相关下拉菜单的一张表中筛选数据库结果。这是我到目前为止所拥有的。

<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 }}来填充第二个下拉过滤器,但是它是空的。

模板中的change函数起作用,因此当我选择“ 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来过滤这样的数据库。因此,仅在第二个下拉列表中显示所有值。还是我必须更改视图以将不同的数据发送到模板。

任何帮助将不胜感激。我在这个问题上停留了太久了。

0 个答案:

没有答案