这里用省市区的关联下拉框为例子
a.1.创建数据模型类poills/models.py
:
class AddressInfo(models.Model):
""" 省市县地址信息 """
address = models.CharField(max_length=100, null=True, blank=True, verbose_name='地址')
# 自关联方式一:传'self'
pid = models.ForeignKey('self', on_delete=models.CASCADE, null=True, blank=True, verbose_name='自关联')
# 自关联方式二:传对应Model中的该字段的名称,比如说叫'AddressInfo'
# pid = models.ForeignKey('AddressInfo', on_delete=models.CASCADE, null=True, blank=True, verbose_name='自关联')
def __str__(self):
""" 给不同的Model对象返回个可读的字符串 """
return self.address
a.2.数据库迁移,生成表数据
python manage.py makemigrations # 生成migrations临时文件
python manage.py migrate # 根据migrations直接生成数据库
b.创建对应的视图类polls/views.py
:
from django.shortcuts import render
from django.views import View
from django.http import JsonResponse
from .models import AddressInfo
def address(request):
"""地址选择页视图"""
return render(request, 'address.html') # address.html代码就不放了
class AddressAPI(View):
""" AddressInfo数据模型类对应的视图类 """
def get(self, request, address_id): # 接受一个参数id,即AddressInfo数据模型的pid属性对应的字段,也就是表中的pid
if int(address_id) == 0: # 0时表示查询省份,省份的pid_id为null
address_data = AddressInfo.objects.filter(pid_id__isnull=True).values('id', 'address')
else: # 查询市或者区县
address_data = AddressInfo.objects.filter(pid_id=int(address_id)).values('id', 'address')
area_list = [] # 转成list,以便后面进行json序列化
for a in address_data:
area_list.append({'id': int(a['id']), 'address': a['address']})
# 因为这里是list而不是dict,所以safe需要为False
return JsonResponse(area_list, content_type='application/json', safe=False)
c.配置对应的路由polls/urls.py
from django.urls import path
from . import views
urlpatterns = [
path(r'address', views.address, name='address'),
# URL转换器中传递过去的参数名,需要和对应的View方法的参数名一样
path(r'address/', views.AddressAPI.as_view(), name='address')
]
d.在polls
项目下,创建目录templates/polls
或templates
,并创建下面的html文件。
address.html
地址信息
e.运行django项目,访问http://localhost:8000/polls/address
结果:此时还没有数据,可以到Djang的admin后台导入数据。
address页
f.创建一个Django后台新用户
命令:manage.py createsuperuser
后台用户
g.注册应用,把刚刚所创建的AddressInfo
数据模型类添加到Django后台首页
polls/admin.py
from django.contrib import admin
# Register your models here.
from .models import AddressInfo
admin.site.register(AddressInfo)
h.进入http://localhost:8000/admin/,并登录(为了安全,实际情况会到urls.py
修改路径,不使用默认的admin)
后台首页
进入添加数据
省份数据,无关联
添加广州市,并关联广东省
添加完毕
此时数据表已经加入了数据:
addressinfo表
省市区
省市
PS.因为例子使用的之前注册过的应用polls
,所以步骤中没有说明注册App这一步。
settings.py
:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
# 注册子应用
'polls.apps.PollsConfig'
]