1.配置数据库
在trip_server/settings.py中修改配置:
其格式可访问官网:Settings | Django documentation | Django
1.1 配置数据库
文件地址:trip_server/settings.py
配置前需要创建(NaviCat)个人数据库
"ENGINE": "django.db.backends.mysql" #数据库驱动
"NAME": "trip_django1" #库名(自设)
"USER": "root" #登录数据库用户名
"PASSWORD": "888888" #登录数据库密码(自设)
"HOST": "localhost" #数据库的ip地址
"PORT": "3306" #数据库端口号,允许穿过防火墙(默认)
DATABASES = {
#默认连接的数据库
"default": {
"ENGINE": "django.db.backends.mysql",
"NAME": "trip_django1",
"USER": "root",
"PASSWORD": "888888",
"HOST": "localhost",
"PORT": "3306",
}
}
1.2 引入数据库依赖
文件地址:trip_server/settings.py
from pathlib import Path
#引入数据库依赖
import pymysql
pymysql.install_as_MySQLdb()
# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent
2.新建system模块并建立模型
2.1 在终端中建表
python manage.py startapp system
2.2 建立模型
文件地址:system/models.py
from django.db import models
# Create your models here.
#数据库中表的映射类,根据该文件构建及操作数据库
class Slider(models.Model):
"轮播图"
name = models.CharField('名称',max_length=32)
desc = models.CharField('描述',max_length=100, null=True, blank=True)
types = models.SmallIntegerField("展现的位置",default=10)
img = models.ImageField('图片地址',max_length=255, upload_to='%Y%m/slider')
reorder = models.SmallIntegerField('排序字段',default=0,help_text="数字越大越靠前")
start_time = models.DateTimeField('生效开始时间',null=True, blank=True)
end_time = models.DateTimeField('生效结束的时间',null=True, blank=True)
target_url = models.CharField('跳转的地址',max_length=255, null=True, blank=True)
is_valid = models.BooleanField('是否有效',default=True)
created_at = models.DateTimeField('创建时间',auto_now_add=True)
updated_at = models.DateTimeField('修改时间',auto_now=True)
class Meta:
db_table = 'system_slider'
ordering = ['-reorder']#默认排序规则
2.3 配置system模块
文件地址:trip_server/settings.py
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
#Here👇
'system.apps.SystemConfig',
#Here👆
]
2.4 在数据库中创新列表
在NaviCat中创建mysql表格。
2.5 检查运行
python manage.py check
python manage.py makemigrations
python manage.py migrate
2.6 配置视图函数
文件地址:system/views.py
创建视图函数,用于返回轮播数据列表【def】
queryset = Slider.objects.filter(is_valid=True):
对数据源(数据库里的数据)进行过滤,相当于在sql语句中加where条件
for item in queryset:
对结果集进行遍历,将数据封装至objects中
return http.JsonResponse(data):
返回一个json格式的对象,json是标准的网络传输数据的格式
return HttpResponse(data)
from django import http
from django.shortcuts import render
from system.models import Slider
# Create your views here.
def slider_list(request):
#规范响应数据结构
data = {
'meta':{
},
'objects':[]
}
queryset = Slider.objects.filter(is_valid=True)
for item in queryset:
data['objects'].append({
'id': item.id,
'img_url': item.img.url,
'target_url': item.target_url,
'name': item.name
})
return http.JsonResponse(data)
2.7 暴露地址
该文件用于暴露视图函数的链接地址
path配置具体的函数地址:
参数1:自定义访问地址;
参数2:访问视图函数的位置;
参数3:链接名字。
from django.urls import path
from system import views
#配置访问地址列表
urlpatterns= [
path('slider/list/',views.slider_list,name='slider_list')
]
2.8 定义项目的URL路由
将路径'system/'
映射到system
应用的URL配置。
from django.contrib import admin
from django.urls import path,include
urlpatterns = [
path('admin/', admin.site.urls),
#here~👇
path('system/', include('system.urls')),
#here~👆
]
3.设计景点ORM模型
终于联动网页了(*硬撑)
python manage.py startapp sight
3.1 景点模块数据准备
文件地址:sight/models.py
from django.db import models
# Create your models here.
class Sight(models.Model):
""" 景点基础信息 """
name = models.CharField('名称', max_length=64)
desc = models.CharField('描述', max_length=256)
main_img = models.ImageField('主图', upload_to='%Y%m/sight/', max_length=256)
banner_img = models.ImageField('详情主图', upload_to='%Y%m/sight/', max_length=256)
content = models.TextField('详细')
score = models.FloatField('评分', default=5)
min_price = models.FloatField('最低价格', default=0)
province = models.CharField('省份', max_length=32)
city = models.CharField('市区', max_length=32)
area = models.CharField('区/县', max_length=32, null=True)
town = models.CharField('乡镇', max_length=32, null=True)
is_top = models.BooleanField('是否为精选景点', default=False)
is_hot = models.BooleanField('是否为热门景点', default=False)
is_valid = models.BooleanField('是否有效', default=True)
created_at = models.DateTimeField('创建时间', auto_now_add=True)
updated_at = models.DateTimeField('修改时间', auto_now=True)
class Meta:
db_table ='sight'
ordering = ['-updated_at']
3.2 配置system模块
文件地址:settings.py
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'system.apps.SystemConfig',
#Here👇
'sight.apps.SightConfig'
#Here👆
]
3.3 检查运行
python manage.py check
python manage.py makemigrations
python manage.py migrate
在NaviCat中刷新后可看到,新创建了的“sight”:
3.4 配置视图函数
文件地址:sight/views.py
class SightListView(ListView):#该类用于查询景点列表信息
paginate_by = 5:#初始每页放5条数据
def get_queryset(self): #根据条件查询数据
query = Q(is_valid=True) #重写查询方法:1. Q查询条件:该对象可以拼接多个条件 2. is_valid=True:表中is_valid列,有值则被查询出来
----------------><----------------
def render_to_response(self, context, **response_kwargs):
def render_to_response:用于响应数据;
context类的上下文对象:
记录类的属性列表,其中包含了ListView子类SightList的所有属性及数据
page_obj = context['page_obj']:#利用上下文对象获取页面信息
from django.shortcuts import render
from django import http
from django.db.models import Q
from django.views.generic import ListView
from sight.models import Sight
# Create your views here.
class SightListView(ListView):
paginate_by = 5
def get_queryset(self):
query = Q(is_valid=True)
#1.获得热门景点
is_hot = self.request.GET.get('is_hot',None)
if is_hot:
query = query & Q(is_hot=True)
#2.获得精选景点
is_top = self.request.GET.get('is_top',None)
if is_top:
query = query & Q(is_top=True)
#3.景点名称搜索
queryset = Sight.objects.filter(query)
return queryset
def render_to_response(self, context, **response_kwargs):
page_obj = context['page_obj']
#合成响应数据
data = {
'meta':{
'total_count':page_obj.paginator.count,
'page_count':page_obj.paginator.num_pages,
'current_page':page_obj.number,
},
'objects':[],
}
for item in page_obj.object_list:
data['objects'].append({
'id':item.id,
'name':item.name,
'main_img':item.main_img.url,
'min_price':item.min_price,
'score':item.score,
'province':item.province,
'city':item.city,
'comment_count':0
})
return http.JsonResponse(data)
3.5 暴露地址
文件地址:sight/urls.py
from django.urls import path
from sight import views
urlpatterns = [
path('/sight/list/', views.SightListView.as_view(), name='sight_list')
]
3.6 定义项目的URL路由
文件地址:trip_server/urls.py
from django.contrib import admin
from django.urls import path,include
urlpatterns = [
path('admin/', admin.site.urls),
path('system/', include('system.urls')),
#here~👇
path('sight',include('sight.urls')),
#here~👆
]
3.7 运行
端口号:http://localhost:8000/
4.Apifox
3.1 新建项目:
3.2 新建目录
3.3 填写端口号
3.4 输出结果
参数名可调,如page页数等;参数值1,即第1页。