内容回顾
django处理请求的流程
- 浏览器的地址栏输入地址,发送get请求
- wsgi接收到请求
- 根据url的路径找到对应的函数
- 执行函数,返回响应。响应返回给wsgi,wsgi按照HTTP响应格式返回给浏览器
发请求的途径
- 地址栏中输入地址- ->get
- a标签 --->get
- form表单 ---> get/post
ORM
-
对象关系
类 ---> 数据表 对象 ---> 数据行(记录) 属性 ---> 字段
django使用MySQL数据库的流程:
-
创建一个MySQL数据库的流程
-
配置
ENGINE mysql NAME 数据库名称 HOST IP PORT 3306 USER 用户名 PASSWORD 密码
-
告诉django使用pymysql连接数据库
-
在与settings统计的init文件夹中写:
import pymysql pymysql.install_as_MySQdb()
-
-
写表 在app下的models.py中写类
class Book(models.Model): name = models.CharField(max_length=32) pub = modols.ForeignKey('Publisher',on_delete=models.CASECADE)
-
执行数据库迁移命令
python manage.py makemigrations #记录models.py的变更记录
python manage.py migrate #将变更记录同步到数据库中
增删改查
-
增
book_obj = Book.object.create(name='xxx',pub=出版社对象) book_obj = Book.object.create(name='xxx',pub_id=出版社对象的id) book_obj = Book(name='xxx',pub=出版社对象) book_obj.save
-
查
#查询所有的对象 Book.objects.all() #--->queryset 对象列表 #查询一个对象 book_obj = Book.objects.get(name='xxx') #---->对象(有且唯一) 查不到或者多个就报错 #查询满足条件的所有的对象 Book.objects.filter(name='xxx') #--->queryset 对象列表 book_obj.id book_obj.pk book_obj.name book_obj.pub #--->出版社对象 book_obj.pub.pk book_obj.pub_id
-
删除
book_obj.delete() Book.objects.filter(pk=1).delete()
-
改
book_obj.name = 'xxx' book_obj.pub = 出版社对象 book_obj.pub_id = 出版社的id book_obj.save() #-->保存到数据库中
模板的语法
render(request,'模板的文件名',{"xxx":"vi"})
{{ xxx }}
for循环
{% for i in list %}
{{ forloop.counter}}
{{ i }}
{% endfor %}
if判断
{% if 条件1 %}
xxx
{% elif 条件2%}
xxx
{% else %}
xxx
{% endif %}
函数
- request
- request.method ---> 请求方式 GET POST
- request.GET ---> url上的参数 ?name=xxx&age=18 {} [] .get
- request.POST ---> form表单提交POST请求的数据
响应
- HTTPResponse('字符串') ----> 字符串
- render(request,'模板的文件名',{}) ---->返回一个完整的页面
- redirect('重定向的地址') ---->本质Location:地址
今日内容
作者的管理
-
设计表结构
出版社 书籍 作者
-
作者展示
def author_list(request): # 获取到所有的作者信息 all_authors = models.Author.objects.all().order_by('pk') # for author in all_authors: # print(author) # print(author.name) # print(author.id) # print(author.books) # 管理对象 # print(author.books.all()) # 作者关联的所有书籍对象 # print("*" * 30) return render(request, 'author_list.html', {'all_authors': all_authors})
<table border="1"> <thead> <tr> <th>序号</th> <th>id</th> <th>名字</th> <th>代表作</th> <th>操作</th> </tr> </thead> <tbody> {% for author in all_authors %} <tr> <td>{{ forloop.counter }}</td> <td>{{ author.pk }}</td> <td>{{ author.name }}</td> <td> {% for book in author.books.all %} {% if forloop.last %} 《{{ book.title }}》 {% else %} 《{{ book.title }}》| {% endif %} {% endfor %} </td> <td> <a href="/del_author/?pk={{ author.pk }}">删除</a> <a href="/edit_author/?pk={{ author.pk }}">编辑</a> </td> </tr> {% endfor %} </tbody> </table>
# 展示作者 url(r'^author_list/', views.author_list),
-
作者增加
# 增加作者 def add_author(request): if request.method == 'POST': # 获取提交的数据 new_name = request.POST.get('name') book_ids = request.POST.getlist('books') # print(request.POST) # print(new_name) # print(book_ids) # 数据插入到数据库中 # 创建一个新的作者 author_obj = models.Author.objects.create(name=new_name) # 作者与书籍做多对多的关联 author_obj.books.set(book_ids) return redirect('/author_list/') # 获取所有的书籍的信息 all_books = models.Book.objects.all() return render(request, 'add_author.html', {"books": all_books})
-
删除作者
# 删除作者 def del_author(request): # 从URL上获取要删除对象的ID del_id = request.GET.get('pk') # 删除对象 models.Author.objects.get(pk=del_id).delete() # models.Author.objects.filter(pk=del_id).delete() # 1. 删除了查询的对象 # 2. 删除了对象的多对多的记录 return redirect('/author_list/')
-
编辑作者
# 编辑作者 def edit_author(request): # 获取要编辑的作者的ID pk = request.GET.get('pk') # 获取编辑的对象 author_obj = models.Author.objects.get(pk=pk) if request.method == 'POST': # 获取提交的数据 name = request.POST.get('name') book_ids = request.POST.getlist('books') # 修改数据 # 修改了作者名字 author_obj.name = name author_obj.save() # 修改作者和书籍多对多的关系 author_obj.books.set(book_ids) # 所有的记录都重新设置 不需要save() return redirect('/author_list/') # 查询所有的书籍 books = models.Book.objects.all() return render(request, 'edit_author.html', {'author_obj': author_obj, 'books': books})
django设置多对多的方法
-
django帮我们生成第三张表
class Author(models.Model): name = models.CharField(max_length=32, unique=True) # 作者的名字 books = models.ManyToManyField('Book') # 表示作者和书籍 多对多的关系
-
自己创建第三张表
class Author_book(models.Model): author = models.ForeignKey('Author') book = models.ForeignKey('Book') date = models.DateTimeField()
-
自建的表和django中ManyToManyField联合使用
class Author(models.Model): name = models.CharField(max_length=32, unique=True) # 作者的名字 books = models.ManyToManyField('Book', through='Author_book',through_fields = ['author','tuijian']) # 表示作者和书籍 多对多的关系;不在Author表中生产字段,生产第三张表 class Author_book(models.Model): author = models.ForeignKey(Author,related_name='a',on_delete=models.CASCADE) book = models.ForeignKey(Book,on_delete=models.CASCADE) tuijian = models.ForeignKey(Author,related_name='b',on_delete=models.CASCADE) date = models.DateTimeField()