目录
- 新建项目
- 新建项目
- 选择编译器
- 选择的编译器没有django要在控制台安装 pip install django==x.x.x
- 安装完成后的目录(set为项目配置文件-应用、数据库、模板等配置;urls为整个项目的url声明绑定函数;wsgi为与WSGI兼容的web服务器,为项目提供服务入口点;manage为命令行工具,管理Django项目)
- 在控制台创建名为CRUD的app
- CRUD_Django项目目录下会生成一个CRUD的app目录,(migrations/目录下的文件是用来记录models数据变更的;admin是映射models中的数据Django自带的adimn后台来管理数据CRUD;apps是配置CRUD应用的;models是Django的模型文件,用来创建数据库表模型的;test是用来编写测试用例的;views视图文件用来编写业务逻辑控制向前端页面显示的内容)如下
- 配置运行时自启动浏览器页面
- 运行成功时浏览器页面![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/f852dd99056ae6c27ac6db7166908ee9.png)
- 配置项目
- **配置mysql数据库:**首先电脑要安装好mysql数据库,然后在cmd终端或者Navicat数据库管理工具创建与项目同名的数据库(下图在Navicat中创建数据库,首先要先连接好是本地还是云的主机,在主机里再创建数据库)
- 在Django中使用mysql的话要安装第三方库pymysql来操作数据库。
- 在项目目录下的setting.py文件中配置mysql数据库信息
- 配置完数据库后,现在数据库还是空的,得先models文件中的表模型迁到数据库,自动创建表。
- 所以要先设计好系统的数据库中的每个表,在models中编写。(这里不设计数据库了,单纯的做一个用户信息表,商品表,购买记录表来实现CRUD)
- 在控制台中迁移数据库(使用python manage.py makemigrations;python manage.py migrate两条命令来迁移),在这里遇到一些问题所没有安装mysqlclient——pip install mysqlclient,模型中的外键没有添加必要的on_delete=models.CASCADE参数来级联被引用表主键,当被引用表删除记录时此表也删除修改记录。模型没有继承models.Models类,无法作为外键中选定的主类。
- 在CRUD应用目录下的admin.py文件中编写admin页面的可操作项
- 在admin页面中管理数据库中的数据
- 在CRUD_Django项目目录下的setting.py中,将CRUD应用添加CRUD_Django项目中。
- 说完admin中的CRUD,这里说一下在CRUD应用中views.py文件的代码CRUD
- 在项目的urls.py文件中,声明浏览器访问的url指向的CRUD应用中views.py文件中的功能函数
- 在CRUD应用的views中编写对应的业务逻辑函数index。
- 在项目目录下的templates目录中,编写CRUD应用views文件中index函数响应的html模板文件
- 使用django分页器实现分页显示:
- Django数据处理流程
- Django以及web的相关知识
- Django的Rest framework框架
新建项目
- 新建项目
- 选择编译器
- 选择的编译器没有django要在控制台安装 pip install django==x.x.x
- 安装完成后的目录(set为项目配置文件-应用、数据库、模板等配置;urls为整个项目的url声明绑定函数;wsgi为与WSGI兼容的web服务器,为项目提供服务入口点;manage为命令行工具,管理Django项目)
- 在控制台创建名为CRUD的app
- CRUD_Django项目目录下会生成一个CRUD的app目录,(migrations/目录下的文件是用来记录models数据变更的;admin是映射models中的数据Django自带的adimn后台来管理数据CRUD;apps是配置CRUD应用的;models是Django的模型文件,用来创建数据库表模型的;test是用来编写测试用例的;views视图文件用来编写业务逻辑控制向前端页面显示的内容)如下
- 配置运行时自启动浏览器页面
- 运行成功时浏览器页面
- **配置mysql数据库:**首先电脑要安装好mysql数据库,然后在cmd终端或者Navicat数据库管理工具创建与项目同名的数据库(下图在Navicat中创建数据库,首先要先连接好是本地还是云的主机,在主机里再创建数据库)
- 在Django中使用mysql的话要安装第三方库pymysql来操作数据库。
- 在项目目录下的setting.py文件中配置mysql数据库信息
- 配置完数据库后,现在数据库还是空的,得先models文件中的表模型迁到数据库,自动创建表。
- 所以要先设计好系统的数据库中的每个表,在models中编写。
- 在控制台中迁移数据库
- **配置admin界面:**在admin.py文件中编写admin页面的可操作项
- 在admin页面中管理数据库中的数据
新建项目
选择编译器
选择的编译器没有django要在控制台安装 pip install django==x.x.x
安装完成后的目录(set为项目配置文件-应用、数据库、模板等配置;urls为整个项目的url声明绑定函数;wsgi为与WSGI兼容的web服务器,为项目提供服务入口点;manage为命令行工具,管理Django项目)
在控制台创建名为CRUD的app
CRUD_Django项目目录下会生成一个CRUD的app目录,(migrations/目录下的文件是用来记录models数据变更的;admin是映射models中的数据Django自带的adimn后台来管理数据CRUD;apps是配置CRUD应用的;models是Django的模型文件,用来创建数据库表模型的;test是用来编写测试用例的;views视图文件用来编写业务逻辑控制向前端页面显示的内容)如下
配置运行时自启动浏览器页面
运行成功时浏览器页面
配置项目
**配置mysql数据库:**首先电脑要安装好mysql数据库,然后在cmd终端或者Navicat数据库管理工具创建与项目同名的数据库(下图在Navicat中创建数据库,首先要先连接好是本地还是云的主机,在主机里再创建数据库)
在Django中使用mysql的话要安装第三方库pymysql来操作数据库。
在项目目录下的setting.py文件中配置mysql数据库信息
配置完数据库后,现在数据库还是空的,得先models文件中的表模型迁到数据库,自动创建表。
所以要先设计好系统的数据库中的每个表,在models中编写。(这里不设计数据库了,单纯的做一个用户信息表,商品表,购买记录表来实现CRUD)
from django.db import models
# Create your models here.
class Account(models.Model):
account=models.CharField(primary_key=True,max_length=50) #账号做主键
password=models.CharField(max_length=50) #密码
username=models.CharField(max_length=50) #用户名
address=models.CharField(max_length=200) #用户地址
email=models.EmailField() #用户邮箱
create_time=models.DateTimeField(auto_now=True) #用户创建时间(自动获取当前时间)
def __str__(self): #将对象以str的方式显示出来
return self.username
class Goods(models.Model): #无定义主键会自动创建一个自增的id
name=models.CharField(max_length=50) #商品名称
detail=models.CharField(max_length=200) #商品描述
address=models.CharField(max_length=200) #商品地址
count=models.IntegerField() #商品数量
price=models.IntegerField() #商品价格
def __str__(self):
return self.name
class Order(models.Model): #联系用两表的主键做成外键做主键
number=models.IntegerField() #订单号
pay_if=models.BooleanField(default=False) #订单支付状态
account=models.ForeignKey(Account(),on_delete=models.CASCADE) #关联用户表,当主表删除时级联删除此表中的记录
goods=models.ForeignKey(Goods,on_delete=models.CASCADE) #关联商品表
creat_time=models.DateTimeField(auto_now=True) #订单创建时间(自动获取当前时间)
class Meta:
unique_together=("account","goods") #用户表和商品表外键做主键
def __str__(self):
return self.number
在控制台中迁移数据库(使用python manage.py makemigrations;python manage.py migrate两条命令来迁移),在这里遇到一些问题所没有安装mysqlclient——pip install mysqlclient,模型中的外键没有添加必要的on_delete=models.CASCADE参数来级联被引用表主键,当被引用表删除记录时此表也删除修改记录。模型没有继承models.Models类,无法作为外键中选定的主类。
在CRUD应用目录下的admin.py文件中编写admin页面的可操作项
from django.contrib import admin
from CRUD.models import Account,Order,Goods
#定义可操作对象的操作类属性
class AccountAdmin(admin.ModelAdmin):
list_display = ['account','username','password']
search_fields = ['account'] #搜索栏
list_filter = ['username'] #过滤器
class GoodsAdmin(admin.ModelAdmin):
list_display = ['name','detail','address','count','price']
search_fields = ['name'] # 搜索栏
list_filter = ['address'] # 过滤器
class OrderAdmin(admin.ModelAdmin):
list_display = ['number','account','goods','pay_if']
search_fields = ['number','goods','account'] # 搜索栏
list_filter = ['pay_if'] # 过滤器
# 为数据表模型注册可操作对象和声明绑定的操作类
admin.site.register(Account,AccountAdmin)
admin.site.register(Goods,GoodsAdmin)
admin.site.register(Order,OrderAdmin)
在admin页面中管理数据库中的数据
在CRUD_Django项目目录下的setting.py中,将CRUD应用添加CRUD_Django项目中。
说完admin中的CRUD,这里说一下在CRUD应用中views.py文件的代码CRUD
#增
#方法一:先new一个表模型对象,然后保存
a1=Account(account='2',username='name2',password='pwd2',
address='addr2',email='email2@qq.com')
a1.save()
#方法二:直接创建一条记录
a2=Account.objects.create(account='3',username='name3',password='pwd3',
address='addr3',email='email3@qq.com')
#删
#先把记录get()出来再delete()
Account.objects.get(account='3').delete()
#改
#方法一:先get出来后,修改再保存
a2=Account.objects.get(account='2')
a2.password='pwd2.1'
a2.save()
#方法二:直接select之后更新
Account.objects.select_for_update().filter(account='2').update(passward='pwd2.1')
#查
#方法一:get查询存在一条记录返回一个对象,多条记录和无记录报错。
Account.objects.get()
#方法二:filter查询存在返回一个对象列表,不存在返回空列表
#属性名后面加双下划线可以变为数据库特殊查询,如模糊查询等
Account.objects.filter(account__startswith='a')
在项目的urls.py文件中,声明浏览器访问的url指向的CRUD应用中views.py文件中的功能函数
在CRUD应用的views中编写对应的业务逻辑函数index。
在项目目录下的templates目录中,编写CRUD应用views文件中index函数响应的html模板文件
使用django分页器实现分页显示:
- 思想:用django的分页器Paginator和PageNotAnInteger,EmptyPage异常类型来实现,先将结果集给分页器设每页记录数分为页对象。让后根据页对象的页值来判断是否有上下页来控制前端显示和后端判断传来的参数是否有或超页来选择第一页还是最后一页。返回的是页对象结果集。
- 上一页/下一页的链接是’?page={{orders.next_page_number}}’='CRUD_Order?page={{orders.next_page_number}}'既是直接请求当前浏览器的url修改了url带的参数而已。
<ul class="pagination">
{% if orders.has_previous %}
<li>
<a href="?page={{ orders.previous_page_number }}">上一页</a>
</li>
{% endif %}
<li>
<a href="?page={{ orders.number }}">{{ orders.number }}</a>
</li>
{% if orders.has_next %}
<li>
<a href="?page={{ orders.next_page_number }}">下一页</a>
</li>
{% endif %}
</ul>
from django.core.paginator import Paginator,PageNotAnInteger,EmptyPage
@login_required
def CRUD_Order(request):
#获取当前用户的订单信息,写入模板中
a=request.session.get('account')
orders=Order.objects.filter(account=a)
page=request.GET.get('page','2')
#分页逻辑
#将orders结果集分成2页
p=Paginator(orders,2)
#分页器中有多少条记录,有多少页
print(p.count,p.page_range)
try:
contact_orders=p.page(page)
print('当前页数:',page)
print(contact_orders.has_previous(),contact_orders.has_next())
except PageNotAnInteger:
#不是数字取第一页
contact_orders=p.page(1)
except EmptyPage:
#不在分页器分页范围,取最后一页
contact_orders=p.page(p.num_pages)
return render(request,'CRUD_Order.html',{'username':request.session.get('username'),"orders":contact_orders})
Django数据处理流程
通过浏览器请求进入项目的urls.py文件中,寻找与浏览器请求存在绑定关系的views.py中的函数,跳转到功能函数,在功能函数中获取浏览器请求中的数据,根据请求数据来通过orm技术操作models.py中的对象获取/存储/处理数据,返回处理后的数据信息,(写入到html等模板文件中,将填完数据的模板发送给浏览器。)/(直接发送json数据给浏览器在前端写入到页面,不用次次都建立七层连接,而是基于RPC通信。)
Django以及web的相关知识
{{}}和{% %}为Django的模板语言标签;
{{time | date:“Y-m-d H:i:s” }}时间类型的数据填模板时为英文时间,在模板语言中加上过滤器,要在js中的变量中填django后台数据是{{var | safe}};
登录提交表单的时候可以在表单里加上{% csrf_token %}来防止CSRF漏洞(跨站请求伪造-即登录后未退出,浏览器保存了登录请求信息,访问一些黑网站时,会被利用伪装成你去访问网站);
session和cookie都是用来保存用户信息的,区别是session在浏览器中只保存了session_id,用户数据是保留在服务器中的,而cookie则是把所有用户数据保留在浏览器中,虽然服务器中也有保留一份,但是可能会被利用;
from django.contrib.auth.decorators import login_required
加上登录验证装饰器,未登录不能url直接访问@login_required
Django的Rest framework框架
rest表现层状态转换;views里面直接像之前在admins.py中编写的操作类属性那样就可以UI创建好接口。