Django 之 Ajax

此次主要是做省市区的三级联动。

环境:django 1.10

 

1. urls.py

 1 # coding:utf-8
 2 from django.conf.urls import url
 3 
 4 import views
 5 
 6 urlpatterns = [
 7     # ajax练习
 8     url(r'^area/$', views.areaindex, name='area'),
 9     url(r'^province/(?P<id>\d+)$', views.province, name='province'),
10     ]

 

2. models.py

1 # coding:utf-8
2 from django.db import models
3 
4 class AreaInfo(models.Model):
5     title = models.CharField(max_length=20)
6     parent = models.ForeignKey('self', null=True, blank=True) # 省的parent为空,存储为NULL
7     
8     # 访问上级对象:area.parent
9     # 访问下级对象:area.areainfo_set.all()

这里一定要注意第6行,自连接,parent 存的是父级的 id。

这里改完 models.py 后要记得迁移

liuqian@ubuntu:~$ python manage.py makemigration
liuqian@ubuntu:~$ python manage.py migrate

迁移完后录入数据。数据库字段如下:

 

3. views.py

 1 # coding:utf-8
 2 from django.shortcuts import render
 3 from django.http import JsonResponse
 4 
 5 from models import AreaInfo
 6 
 7 def areaindex(request):
 8     '''ajax练习'''
 9     return render(request, 'area.html')
10 
11 def province(request, id):
12     id = int(id)
13     if id == 0:
14         # 查询省份
15         provinces = AreaInfo.objects.filter(parent__isnull=True).values('id', 'title')
16     else:
17         # 查询区
18         provinces = AreaInfo.objects.filter(parent=id).values('id', 'title')
19     return JsonResponse({'data': list(provinces)})

注意:第15行和第18行的 values('id', 'title') 。因为 parent 字段是自连接字段,所以如果 values() 不带参数,可能会导错误(根据dajngo版本来决定)。

 

4. area.html

 1 {% load static from staticfiles %}
 2 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
 3 "http://www.w3.org/TR/html4/loose.dtd">
 4 <html>
 5     <head>
 6         <title>ajax练习</title>
 7         <script src="{% static 'js/jquery-1.10.2.min.js' %}"></script>
 8         <!-- <script src="/static/book/js/jquery-1.10.2.min.js"></script> -->
 9         <script>
10         $(function(){
11             // 显示省
12             $.get("{% url 'province' 0 %}", function(dic){ // {data:{id:..., title:...},{}}
13                 pro = $('#pro');
14                 $.each(dic.data, function(index, item) { // item ---> {id:..., title:...}
15                     pro.append('<option value="' + item.id + '">' + item.title + '</option>')
16                 })
17             })
18             
19             // 根据省显示市
20             $('#pro').change(function(){
21                 $.get("/province/" + $(this).val(), function(city_data){
22                     city = $('#city');
23                     city.empty().append('<option value="0">请选择市</option>');
24                     $('#dis').empty().append('<option value="0">请选择区</option>');
25                     $.each(city_data.data, function(index, item){
26                         city.append('<option value="' + item.id + '">' + item.title + '</option>')
27                     });
28                 });
29             });
30             
31             // 根据市选择区
32             $('#city').change(function(){
33                 $.get("/province/" + $(this).val(), function(dis_data){
34                     dis = $('#dis');
35                     dis.empty().append('<option value="0">请选择区</option>');
36                     $.each(dis_data.data, function(index, item){
37                         dis.append('<option value="' + item.id + '">' + item.title + '</option>')
38                     });
39                 });
40             });
41         });
42         </script>
43     </head>
44     <body>
45             <select id="pro" name="pro">
46                 <option value="0">请选择省</option>
47             </select>
48             <select id="city" name="city">
49                 <option value="0">请选择市</option>
50             </select>
51             <select id="dis" name="dis">
52                 <option value="0">请选择区</option>
53             </select>
54     </body>
55 </html>

area.html 存放的位置根据 settings.py 中 TEMPLATES 的 DIRS 值来定。

jquery-1.10.2.min.js 存放的位置根据 settings.py 中 STATICFILES_DIRS 的值来定。

 

5. 访问

启动服务后,访问 http://127.0.0.1:8000/area/ ,即可看到下面的界面:

 

posted on 2018-06-04 17:38  刘[小]倩  阅读(325)  评论(0编辑  收藏  举报

导航