Django-最简单二级联动

作者: 镜kong | 来源:发表于2018-03-26 11:15 被阅读15次

    Django + ajax 实现一个最简单的二级联动

    • model 设计
    # 国家
    class Country(models.Model):
        name = models.CharField(max_length=30)
    
        def __str__(self):
            return self.name
    
    # 地区
    class City(models.Model):
        country = models.ForeignKey(Country, on_delete=models.CASCADE)
        name = models.CharField(max_length=30)
    
        def __str__(self):
            return self.name
    
    # 人
    class Person(models.Model):
        name = models.CharField(max_length=100)
        country = models.ForeignKey(Country, on_delete=models.SET_NULL, null=True)
        city = models.ForeignKey(City, on_delete=models.SET_NULL, null=True)
    
        def __str__(self):
            return self.name
    
    • view.py
    # 获取城市
    def load_cities(request):
        country_id = request.GET.get('country')
        cities = City.objects.filter(country_id=country_id).order_by('name')
        return render(request, 'hr/city_dropdown_list_options.html', {'cities': cities})
    
    • city_dropdown_list_options.html
    <option value="">---------</option>
    {% for city in cities %}
    <option value="{{ city.pk }}">{{ city.name }}</option>
    {% endfor %}
    
    • 需要实现二级联动页面的 html
    <form method="post" id="personForm" data-cities-url="{% url 'ajax_load_cities' %}" novalidate>
        {% csrf_token %}
        <table>
          {{ form.as_table }}
        </table>
        <button type="submit">Save</button>
        <a href="{% url 'person_changelist' %}">Nevermind</a>
      </form>
    
      <script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
      <script>
        $("#id_country").change(function () {
          var url = $("#personForm").attr("data-cities-url");
          var countryId = $(this).val();
    
          $.ajax({
            url: url,
            data: {
              'country': countryId
            },
            success: function (data) {
              $("#id_city").html(data);
            }
          });
    
        });
      </script>
    
    • form.py
    class PersonForm(forms.ModelForm):
        class Meta:
            model = Person
            fields = ('name', 'country', 'city')
    
        def __init__(self, *args, **kwargs):
            super().__init__(*args, **kwargs)
            self.fields['city'].queryset = City.objects.none()
    
            if 'country' in self.data:
                try:
                    country_id = int(self.data.get('country'))
                    self.fields['city'].queryset = City.objects.filter(country_id=country_id).order_by('name')
                except (ValueError, TypeError):
                    pass  # invalid input from the client; ignore and fallback to empty City queryset
            elif self.instance.pk:
                self.fields['city'].queryset = self.instance.country.city_set.order_by('name')
    
    • url.py
    urlpatterns = [
        path('', views.PersonListView.as_view(), name='person_changelist'),
        path('add/', views.PersonCreateView.as_view(), name='person_add'),
        path('<int:pk>/', views.PersonUpdateView.as_view(), name='person_change'),
         #主要是下面这条
        path('ajax/load-cities/', views.load_cities, name='ajax_load_cities'),
    ]
    

    效果

    image.png
    image.png

    相关文章

      网友评论

        本文标题:Django-最简单二级联动

        本文链接:https://www.haomeiwen.com/subject/vvnlcftx.html