代码之家  ›  专栏  ›  技术社区  ›  ccsv

多领域基于选择的django链滤波结果

  •  0
  • ccsv  · 技术社区  · 6 年前

    我有以下型号:

    class Country(models.Model):
        name = models.CharField(max_length=50)
    
    class State(models.Model):
        country = models.ForeignKey(Country, on_delete=models.CASCADE)
        name =  models.CharField(max_length=50, null=False, blank=False)
    
    class Species(models.Model):
        name = models.CharField(max_length=50, null=False, blank=False)
        country =models.ManyToManyField(Country)
        state =models.ManyToManyField(State)
    

    假设我在表单或管理字段中添加了多个国家。是否有方法根据我在“国家”字段中选择的内容筛选“国家”字段中的结果?

    例如:

    Countries: States
    
    USA: CA, VA, NV, OR
    
    Mexico: PUB, JAL, SIN
    
    Canada: NU, ON, QC
    

    如果我选择 USA Canada 表单上的状态字段将产生:

    NU, ON, QC, 
    CA, VA, NV, OR
    

    我能找到的最接近的东西是 django-smart-select 但这对我的案子不起作用。

    1 回复  |  直到 6 年前
        1
  •  0
  •   Luci    6 年前

    我将使用ajax+js来实现这一点。我会按照这些原则做点什么( 我没有测试过这个代码 )以下内容:

    HTML格式:

    <select name="country">
      <option value="">Choose a country</option>
      <option value="USA">USA</option>
      <option value="Mexico">Mexico</option>
      <option value="Canada">Canada</option>
    </select>
    
    <select name="state" disabled>
      <option value="">Choose a state</option>
    </select>
    

    JS公司:

    $('select[name="country"]').on('change', function() {
      var country = $(this).val();
      var states = [];
      $('select[name="state"] option:gt(0)').remove(); // cleaning: removes all options except the first
    
      if (!(country)) {
        $('select[name="state"]').prop("disabled", true);
      } else {
        $.ajax({
          url: "{% url 'get_states' %}",
          dataType: "json",
          data: {
            country: country
          },
          success: function(data) {
            data = JSON.parse(data);
            for (var key in data) {
              $('select[name="state"]').append(
                $('<option>', {
                  value: key,
                  text: data[key]
                })
              );
            }
          }
        });
        $('select[name="state"]').prop("disabled", false);
      }
    });
    

    在url.py中:

    url(r'^getstates$', 'myapp.views.get_states', name='get_states'),
    

    在views.py中:

    from django.shortcuts import HttpResponse
    import json
    from myapp.models import Country, State
    
    
    def get_states(request):
        if request.is_ajax():
            country = request.GET.get('country', '')
            states = State.objects.filter(country__name=country)
            state_dict = {}
            for state in states:
                state_dict[state.pk] = state.name
            return HttpResponse(json.dumps(state_dict))
    

    希望这有帮助!