У меня есть модель в моем django, которая описывает автомобили. В ней есть поля:

  • make
  • model
  • price

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

Я видел несколько руководств, но кажется, что все они разделили бы мою модель автомобиля на три разные модели, но с внешними ключами. Я предполагаю, что это будет выглядеть примерно так:

Makes:
- name

Models:
- make (foreign key)
- name

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

Мне интересно, можно ли как-то реализовать это зависимое выпадение в django forms, сохранив только 1 модель автомобилей? И если да, то что я должен нагуглить?

Спасибо.

Ответы (1)

Мне удалось это сделать, внеся небольшие правки в решение по этой ссылке: 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>

urls.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 %}

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

2022 WebDevInsider