首页 > 解决方案 > 带有 ajax 的 Django 依赖下拉列表。我是否需要将我的模型划分为 3 个不同的模型才能实现依赖下拉菜单?

问题描述

我的 django 中有描述汽车的模型。它有字段:

我想让用户通过 django 表单为他们创建查询,我想实现依赖下拉菜单。当用户选择“make”时,可用的“models”会改变。

我看过一些教程,但似乎所有教程都会将我的模型车分成三个不同的模型,但外键。我想它看起来像这样:

Makes:
- name

Models:
- make (foreign key)
- name

Car:
- price
- make (foreign key)
- model (foreign key)

我想知道,是否有可能以某种方式以 django 形式实现这个依赖下拉列表,同时只保留 1 个汽车模型?如果是这样,我应该用谷歌搜索什么?

谢谢。

标签: pythondjangoajaxdjango-models

解决方案


我设法通过对此链接的解决方案进行小幅编辑来做到这一点: https ://simpleisbetterthancomplex.com/tutorial/2018/01/29/how-to-implement-dependent-or-chained-dropdown-list-with- django.html

就我而言,模板中的 ajax 调用如下所示:

{#Ajax call for loading up models based on selected make.#}
            <script>
                $("#id_make").change(function () {
                    const url = $("#SearchForm").attr("data-models-url");
                    const makeId = $(this).val();

                    $.ajax({
                        url: url,
                        data: {
                            'make': makeId
                        },
                        success: function (data) {
                            $("#id_model").html(data);
                        }
                    });

                });
            </script>

网址.py:

# Ajax:
path('ajax/load_models/', templates_views.load_models, name='ajax_load_models'),

视图中的 ajax:

# This view is for AJAX call.
def load_models(request):
    make = request.GET.get('make')
    models = Car.objects.filter(make=make).values('model').annotate(count=Count('make')).order_by('count').distinct().reverse()
    models_count = []
    for model in models:
        models_count.append(Car.objects.filter(model=model['model']).count())

    data = zip(models, models_count)

    return render(request, 'car_prices_tool/models_dropdown_list_options.html', {'data': data})

models_dropdown_list_options.html:

<option value="">--- choose model ---</option>
{% for model, count in data %}
    <option value="{{ model.model }}">{{ model.model }} ({{ count }})</option>
{% endfor %}

我相信这就是全部,多亏了我不必创建更多模型。我只能用一个。


推荐阅读