Django的依赖链下拉选择列表 - 不工作

Posted

技术标签:

【中文标题】Django的依赖链下拉选择列表 - 不工作【英文标题】:Dependent Chained Dropdown Select List with Django - Not working 【发布时间】:2021-10-09 17:07:37 【问题描述】:

我正在尝试以 django 形式构建一个依赖下拉列表,但它不起作用。我关注了视频和教程,但没有运气。

我想选择汽车的品牌(品牌),然后选择汽车的型号。当然,型号取决于汽车的品牌。

我已经按照这个教程https://python.plainenglish.io/python-and-django-create-a-dependent-chained-dropdown-select-list-b2c796f5a11

状态:“制作”下拉菜单工作正常。 “模型”下拉菜单从不显示任何内容。 它只是不起作用,但没有显示错误......:S

models.py

from django.db import models
from django import forms

class Vehicle(models.Model):
    make = forms.CharField(max_length=30)
    model = forms.CharField(max_length=30)
    ...omitted

forms.py

from django import forms
from .models import Vehicle
import json    

def readJson(filename):
    with open(filename, 'r') as fp:
        return json.load(fp)

def get_make():
    """ GET MAKE SELECTION """
    filepath = '/Users/alvarolozanoalonso/desktop/project_tfm/tfm/JSON/make_model_A.json'
    all_data = readJson(filepath)
    all_makes = [('-----', '---Select a Make---')]

    for x in all_data:
        if (x['make_name'], x['make_name']) in all_makes:
            continue
            else:
                y = (x['make_name'], x['make_name'])
                all_makes.append(y)

# here I have also tried "all_makes.append(x['make_name'])

    
            return all_makes
    

class VehicleForm(forms.ModelForm):
    make = forms.ChoiceField(
                    choices = get_make(),
                    required = False,
                    label='Make:',
                    widget=forms.Select(attrs='class': 'form-control', 'id': 'id_make'),
                    )
...omitted



    class Meta:
            model = Vehicle
            fields = ['make', 'is_new', 'body_type', 'fuel_type', 'exterior_color', 'transmission', 'wheel_system', 'engine_type',
                      'horsepower', 'engine_displacement', 'mileage', 'transmission_display', 'year', 'fuel_tank_volume',
                      'city_fuel_economy', 'highway_fuel_economy', 'maximum_seating']

模型.html

% block javascript %
<script>
          $("#id_make").change(function () 
              var makeId = $(this).val();
              $.ajax(
                type: "POST",
                url: "% url 'get-model' %",
                data: 
                  'csrfmiddlewaretoken': ' csrf_token ',
                  'make': makeId,
                ,
                success: function (data) 
                  console.log(data.models);
                  let html_data = '<option value="">-------</option>';
                  data.models.forEach(function (data) 
                      html_data += `<option value="$data">$data</option>`
                  );
                  $("#id_model").html(html_data);
                
              );
);
</script>
% endblock javascript %

<form class="" action="" method="post">
          % csrf_token %
          % for error in errors  %
          <div class="alert alert-danger mb-4" role="alert">
            <strong> error </strong>
          </div>
          % endfor %
          <div class="form-row">

            <div class="form-group col-md-6">
              <label>Status:</label>
                 form.make 
            </div>

            <div class="form-group col-lg-6">
              <label >Model:</label>
              <select id="id_model" class="form-control" name="state">
                <option value="-----">Select Model</option>
              </select>
            </div>
            
            ...omitted

            <div class="form-group col-md-6">
              <button type="submit" class="btn btn-primary">Calculate</button>
            </div>
        </form>

views.py

def model(request):
    context = 
    if request.method == 'GET':
           form  = VehicleForm()
           context['form'] = form
           return render(request, 'model.html', context)
    if request.method == 'POST':
        form  = VehicleForm(request.POST)
        if form.is_valid():
            return render(request, 'model.html', context)

def getModel(request):
    make = request.POST.get('make')
    models = return_model_by_make(make)
    return JsonResponse('models': models)

【问题讨论】:

【参考方案1】:

id_make 的更改处理程序是在 DOM 中创建选择之前附加的,因此您的事件处理程序不会触发。 您可以使用事件委托在创建元素之前设置事件处理程序

  $(document).on('change', "#id_make", function () 
      var makeId = $(this).val();
      $.ajax(
        type: "POST",
        url: "% url 'get-model' %",
        data: 
          'csrfmiddlewaretoken': ' csrf_token ',
          'make': makeId,
        ,
        success: function (data) 
          console.log(data.models);
          let html_data = '<option value="">-------</option>';
          data.models.forEach(function (data) 
              html_data += `<option value="$data">$data</option>`
          );
          $("#id_model").html(html_data);
        
      );
  );

【讨论】:

谢谢你的回答,穆萨!不幸的是,它不起作用...:S 我在创建选择之前和之后都尝试了您的代码,但它不起作用。我应该在 github 上分享整个项目吗? 你可以发一个页面链接,我看看能不能发现问题 您好,Musa,我在 github 上有我的项目,并将其更改为公开几天,以便您可以看到它。非常感谢! github.com/alvarico509/TFM

以上是关于Django的依赖链下拉选择列表 - 不工作的主要内容,如果未能解决你的问题,请参考以下文章

Flask 动态依赖下拉列表

动态依赖选择下拉php sql同一张表

如何传递从 django 表单操作 url 的下拉列表中选择的项目的 ID?

php ajax依赖下拉列表不从表中加载数据

当在另一个下拉列表上进行选择时,如何在 Django 的管理员中过滤下拉列表

Ajax 如何与动态 Django 下拉列表一起工作?