第六章 Django实例
1.出版社管理
1.1 展示
1. 创建数据库
#打开cmd窗口,在 命令行,mysql中 create database dj_bookmanager
2. settings.py
BASE_DIR:项目根目录
debug = True(开发) / False(上线)
INSTALL_APPS:注册app
MIDDLEWARW:注释掉csrf校验
TEMPLATES:模版文件目录
DATABASES:配置mysql数据库(6)
STATICFILES_DIRS:配置静态文件
3. models.py
在__init.py中导入pymysql模块,替换默认链接方式
并创建model类,并指定约束
models.AutoField(primary_key = True) #自增并指定主键
models.CharField(max_length=32, unqiue/default=xxx)
models.IntegerField(default=0)
from django.db import models class Publisher(models.Model): pid = models.AutoField(primary_key = True) name = models.CharField(max_length=32, unique=True) # 后续添加,需要指定默认值 addr = models.CharField(max_length=32, default=‘xxx‘) # 或者更改迁移文件
4. 迁移数据库
python manage.py makemigrations python manage.py migrate # 插入数据
5. urls.py
from django.conf.urls import url
from django.contrib import admin
# 导入视图模块
from app1 import views
# 添加调用关系
urlpatterns = [
url(r‘^admin/‘, admin.site.urls),
url(r‘login‘, views.publisher_list),
]6. views.py
from django.shortcuts import render, HttpResponse, redirect
def publisher_list(request):
# 业务逻辑
all_pubulisher = models.Pbulisher.objects.all().order_by(pk)
return render(request, ‘publisher_list.html‘, {‘all_pubulisher‘:all_pubulisher})7. xxx.html
这里使用的是django的渲染语法(在创建app也可以指定jinja2)
{{变量}},{% for 循环%}{%endfor%}(需要闭合)
如果没有参数传入时,html中的{{变量}}在页面中不显示
{# for循环中有 forloop.counter 自动记录循环次数 #}
{% for publisher in all_publisher %}
<tr>
<td>{{forloop.counter}}</td>
<td>{{publisher.pid/pk}}</td>
<td>{{publisher.name}}</td>
</tr>
{% endfor %}
{# if条件判断 #}
{% if 条件判断 %}
{% else %} / {% elif %}
{% endif %}1.2 新增
models.类名.objects.create(字段=值)
# orm插入数据 obj = models.Publisher.objects.create(name=publisher_name) # publisher object print(obj)
- 实例化方式
obj = models.Publisher(name=publisher_name) obj.save() # 保存到数据库中 # obj打印结果:Publisher obj print(obj)
1.3 删除
obj.delete(),obj_list.delete()
对像和对象列表都有delete方法
pk = request.GET.get(‘id‘) obj_list = models.Publisher.objects.filter(pk=pk) # 删除对象 if not obj_list: return HttpResponse(‘删除数据不存在‘) obj_list.delete()
1.4 编辑
obj.字段=值
obj.save() 更新数据到数据库
# 从url中获取的参数,不是get请求的数据 pk = request.GET.get(‘id‘) obj_list = models.Publiser.objects.filter(pk=pk) if not obj_list: return HttpResponse(‘编辑数据不存在‘) obj = obj_list[0] # 内存中修改 obj.name = publisher_name # 内存中数据,提交到数据库 obj.save()
2. 书籍管理
2.1 创建表结构
1. book表
name、作者、出版社、出版时间
class Book(models.Model):
title = models.CharField(max_length=32)
pub_id = models.ForeignKey(to=Publisher,on_delete=models.SET(字段))
# on_delete=models.CASCADE(默认)
# on_delete=models.SET(‘具体值’)
# on_delete=models.SET_DEFAULT, defalut=‘xxx‘
# on_delete=models.SET_NULL
# on_delete参数在django2.0之后必填
# 通过反射获取, on_delete默认级联删除
pub = models.ForeignKey(‘Publisher‘, on_delete=models.SET_NULL)2.创建book数据库
3. 数据库迁移
python manage.py makemigrations python manage.py migrate # 外键名django自动加 _id # django.migrations也会在数据库中创建
2.2 查询
models.py
models中的pub是被关联类的对象
django会自动生成 pub_id
for book in all_Book.objects.all():
# book类中属性
print(book.pk)
print(book.title)
print(book.pub_id)
print(book.pub, type(book.pub))
# publisher中属性
# print(book.pub_id)只需要出版社id,建议使用
print(book.pub.pk)
print(book.name)for+table,自动补全,pycharm提供 # __str__方法 print(book.pub)
2.3 展示
def list_book(request):
all_books = models.Book.objects.all()
return render(request, ‘list_book.html‘, {‘all_books‘: all_books})2.4 新增
views.py
def add_book(request):
error = ‘‘
if request.method == ‘POST‘:
title = request.POST.get(‘book_name‘)
pk = request.POST.get(‘id‘)
print(title, pk)
# 可以使用多个字段进行查找
book_set = models.Book.objects.filter(title=title, pub_id=pk)
if book_set:
error = ‘书籍已存在‘
if not title: error = ‘请输入书名‘
if not error:
models.Book.objects.create(title=title, pub_id=pk)
return redirect(‘/list_book/‘)
all_publisher = models.Publisher.objects.all()
return render(request, ‘add_book.html‘, {‘all_publisher‘: all_publisher, ‘error‘: error})2.5 删除
数据库查询到的对象 或 query set 都可以使用delete方法直接删除数据
def del_book(request):
if request.method == ‘GET‘:
pk = request.GET.get(‘id‘)
models.Book.objects.filter(id=pk).delete()
return redirect(‘/list_book/‘)2.6 修改
通过 GET 、 POST 获取的数据一般为 字符串类型
获取的 pub_id 是 str 类型,注意和数据库中字段类型一样
def edit_book(request):
error = ‘‘
pk = request.GET.get(‘id‘)
book = models.Book.objects.get(pk=pk)
if request.method == ‘POST‘:
title = request.POST.get(‘book_name‘)
# 获取的 pub_id 是 str 类型,注意和数据库中字段类型一样
pub_id = request.POST.get(‘id‘)
print(type(title), type(book.title), type(pub_id), type(book.pub_id))
# 判断 书名+出版社 是否被修改
if book.title == title and book.pub_id == int(pub_id):
error = ‘未做任何修改‘
if not title: error = ‘请输入书名‘
# 判断 书名+出版社 是否唯一
if models.Book.objects.filter(title=title, pub_id=pub_id):
error = ‘该书籍已存在‘
if not error:
book.title = title
book.pub_id = pub_id
book.save()
return redirect(‘/list_book/‘)
all_publisher = models.Publisher.objects.all().order_by(‘pid‘)
return render(request, ‘edit_book.html‘, {‘book‘: book, ‘all_publisher‘: all_publisher, ‘error‘: error})