python框架之Django(2)-简单的CRUD
写一个简单的项目小例子来了解Django中的O/RM操作
前戏
创建app
#在Django项目根目录下执行
python3 manage.py startapp [app name]
配置数据库连接信息
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', # 连接的数据库类型
'HOST': '127.0.0.1', # 连接数据库的地址
'PORT': 3306, # 端口
'NAME': "testdb", # 数据库名称
'USER': 'root', # 用户
'PASSWORD': 'root' # 密码
}
}
/[project name]/settings.py->DATABASES节
让Django用pymysql来代替默认的MySQLdb
import pymysql
pymysql.install_as_MySQLdb()
/[project name]/__init__.py
让项目'知道'APP
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'login_app.apps.LoginAppConfig'
]
/[project name]/settings.py->INSTALLED_APPS节
表关系
代码
创建模型
在app下面的models.py文件中定义类,这些类必须继承models.Model
from django.db import models class Press(models.Model):
'''
出版社
'''
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=50, unique=True) class Book(models.Model):
'''
书籍
'''
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=50, unique=True)
press = models.ForeignKey(Press) class Author(models.Model):
'''
作者
'''
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=50, unique=True)
book = models.ManyToManyField(Book)
/[app name]/models.py
执行命令
python3 manage.py makemigrations # 对比模型和db的差异,记录下将要发生的变更
python3 manage.py migrate # 将记录的变更在数据库中执行
CRUD操作
出版社(一对多)
from django.shortcuts import render, HttpResponse, redirect
from bookapp import models def add(request):
'''
添加
'''
if request.method == 'POST':
name = request.POST.get('name')
models.Press.objects.create(name=name).save()
return redirect('/list_press/')
return render(request, 'press/add.html') def list(request):
'''
列表
'''
all_list = models.Press.objects.all()
return render(request, 'press/list.html', {'list': all_list}) def edit(request):
'''
编辑
'''
if request.method == 'POST':
id = request.POST.get('id')
name = request.POST.get('name')
obj = models.Press.objects.get(id=id)
obj.name = name
obj.save()
return redirect('/list_press/')
id = request.GET.get('id')
obj = models.Press.objects.get(id=id)
return render(request, 'press/edit.html', {'press': obj}) def delete(request):
'''
删除
'''
id = request.GET.get('id')
models.Press.objects.get(id=id).delete()
return redirect('/list_press/')/[app name]/service/press.py
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>添加出版社</title>
</head>
<body>
<form action="/add_press/" method="post">
<p>名称:<input name="name" type="text"></p>
<p><input type="submit" value="提交"></p>
</form>
</body>
</html>/templates/press/add.html 添加出版社页
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>出版社列表</title>
</head>
<body>
<a href="/add_press/">添加</a>
<table border="1" style="border-collapse:collapse;">
<tr>
<td>序号</td>
<td>名称</td>
<td>拥有书籍</td>
<td colspan="2">操作</td>
</tr>
{% for press in list %}
<tr>
<td>{{ forloop.counter }}</td>
<td>{{ press.name }}</td>
<td>{% for book in press.book_set.all %}
{% if forloop.counter == press.book_set.all.count %}
{{ book.name }}
{% else %}
{{ book.name }},
{% endif %}
{% endfor %}</td>
<td><a href="/edit_press/?id={{ press.id }}">编辑</a></td>
<td><a href="/del_press/?id={{ press.id }}">删除</a></td>
</tr>
{% endfor %}
</table>
</body>
</html>/templates/press/list.html 出版社列表页
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>修改出版社</title>
</head>
<body>
<form action="/edit_press/" method="post">
<input type="hidden" name="id" value="{{ press.id }}">
<p>名称:<input name="name" type="text" value="{{ press.name }}"></p>
<p><input type="submit" value="提交"></p>
</form>
</body>
</html>/templates/press/edit.html 编辑出版社页
书籍(多对一&多对多)
from django.shortcuts import render, HttpResponse, redirect
from bookapp import models def add(request):
'''
添加
'''
if request.method == 'POST':
press_id = request.POST.get('press_id')
name = request.POST.get('name')
models.Book.objects.create(name=name, press_id=press_id).save()
return redirect('/list_book/')
press_list = models.Press.objects.all()
return render(request, 'book/add.html', {'press_list': press_list}) def list(request):
'''
列表
'''
all_list = models.Book.objects.all()
return render(request, 'book/list.html', {'list': all_list}) def edit(request):
'''
编辑
'''
if request.method == 'POST':
id = request.POST.get('id')
name = request.POST.get('name')
press_id = request.POST.get('press_id')
obj = models.Book.objects.get(id=id)
obj.name = name
obj.press_id = press_id
obj.save()
return redirect('/list_book/')
id = request.GET.get('id')
obj = models.Book.objects.get(id=id)
press_list = models.Press.objects.all()
return render(request, 'book/edit.html', {'book': obj, 'press_list': press_list}) def delete(request):
'''
删除
'''
id = request.GET.get('id')
models.Book.objects.get(id=id).delete()
return redirect('/list_book/')/[app name]/service/book.py
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>添加书籍</title>
</head>
<body>
<form action="/add_book/" method="post">
<p>名称:<input name="name" type="text"></p>
<p>出版社: <select name="press_id" >
{% for press in press_list %}
<option value="{{ press.id }}">{{ press.name }}</option>
{% endfor %}
</select></p>
<p><input type="submit" value="提交"></p>
</form>
</body>
</html>/templates/book/add.html 添加书籍页
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>书籍列表</title>
</head>
<body>
<a href="/add_book/">添加</a>
<table border="1" style="border-collapse:collapse;">
<tr>
<td>序号</td>
<td>名称</td>
<td>出版社</td>
<td colspan="2">操作</td>
</tr>
{% for book in list %}
<tr>
<td>{{ forloop.counter }}</td>
<td>{{ book.name }}</td>
<td>{{ book.press.name }}</td>
<td><a href="/edit_book/?id={{ book.id }}">编辑</a></td>
<td><a href="/del_book/?id={{ book.id }}">删除</a></td>
</tr>
{% endfor %}
</table>
</body>
</html>/templates/book/list.html 书籍列表页
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>修改书籍</title>
</head>
<body>
<form action="/edit_book/" method="post">
<input type="hidden" name="id" value="{{ book.id }}">
<p>名称:<input name="name" type="text" value="{{ book.name }}"></p>
<p>出版社:
<select name="press_id">
{% for press in press_list %}
{% if book.press.id == press.id %}
<option selected value="{{ press.id }}">{{ press.name }}</option>
{% else %}
<option value="{{ press.id }}">{{ press.name }}</option>
{% endif %}
{% endfor %}
</select>
</p>
<p><input type="submit" value="提交"></p>
</form>
</body>
</html>/templates/book/edit.html 编辑书籍页
作者(多对多)
from django.shortcuts import render, HttpResponse, redirect
from bookapp import models def add(request):
'''
添加
'''
if request.method == 'POST':
book_id_list = request.POST.getlist('book_id_list')
print(book_id_list)
name = request.POST.get('name')
author = models.Author.objects.create(name=name)
author.book = book_id_list
author.save()
return redirect('/list_author/')
book_list = models.Book.objects.all()
return render(request, 'author/add.html', {'book_list': book_list}) def list(request):
'''
列表
'''
all_list = models.Author.objects.all()
return render(request, 'author/list.html', {'list': all_list}) def edit(request):
'''
编辑
'''
if request.method == 'POST':
id = request.POST.get('id')
name = request.POST.get('name')
book_id_list = request.POST.getlist('book_id_list')
obj = models.Author.objects.get(id=id)
obj.name = name
obj.book = book_id_list
obj.save()
return redirect('/list_author/')
id = request.GET.get('id')
obj = models.Author.objects.get(id=id)
book_list = models.Book.objects.all()
return render(request, 'author/edit.html', {'author': obj, 'book_list': book_list}) def delete(request):
'''
删除
'''
id = request.GET.get('id')
models.Author.objects.get(id=id).delete()
return redirect('/list_author/')/[app name]/service/author.py
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>添加作者</title>
</head>
<body>
<form action="/add_author/" method="post">
<p>姓名:<input name="name" type="text"></p>
<p>拥有书籍: <select name="book_id_list" multiple>
{% for book in book_list %}
<option value="{{ book.id }}">{{ book.name }}</option>
{% endfor %}
</select></p>
<p><input type="submit" value="提交"></p>
</form>
</body>
</html>/templates/author/add.html 添加作者页
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>作者列表</title>
</head>
<body>
<a href="/add_author/">添加</a>
<table border="1" style="border-collapse:collapse;">
<tr>
<td>序号</td>
<td>姓名</td>
<td>拥有书籍</td>
<td colspan="2">操作</td>
</tr>
{% for author in list %}
<tr>
<td>{{ forloop.counter }}</td>
<td>{{ author.name }}</td>
<td>{% for book in author.book.all %}
{% if forloop.counter == author.book.count %}
{{ book.name }}
{% else %}
{{ book.name }},
{% endif %}
{% endfor %}
</td>
<td><a href="/edit_author/?id={{ author.id }}">编辑</a></td>
<td><a href="/del_author/?id={{ author.id }}">删除</a></td>
</tr>
{% endfor %}
</table>
</body>
</html>/templates/author/list.html 作者列表页
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>修改作者</title>
</head>
<body>
<form action="/edit_author/" method="post">
<input type="hidden" name="id" value="{{ author.id }}">
<p>姓名:<input name="name" type="text" value="{{ author.name }}"></p>
<p>拥有书籍:
<select name="book_id_list" multiple>
{% for book in book_list %}
{% if book in author.book.all %}
<option selected value="{{ book.id }}">{{ book.name }}</option>
{% else %}
<option value="{{ book.id }}">{{ book.name }}</option>
{% endif %}
{% endfor %}
</select>
</p>
<p><input type="submit" value="提交"></p>
</form>
</body>
</html>/templates/author/edit.html 编辑作者页
配置路由
from django.shortcuts import render, HttpResponse, redirect
from bookapp.service import press
from bookapp.service import book
from bookapp.service import author
/[app name]/views.py
from django.conf.urls import url
from django.contrib import admin from django.conf.urls import url
from bookapp import views
urlpatterns = [
url(r'^add_press/', views.press.add),
url(r'^list_press/', views.press.list),
url(r'^edit_press/', views.press.edit),
url(r'^del_press/', views.press.delete),
url(r'^add_book/', views.book.add),
url(r'^list_book/', views.book.list),
url(r'^edit_book/', views.book.edit),
url(r'^del_book/', views.book.delete),
url(r'^add_author/', views.author.add),
url(r'^list_author/', views.author.list),
url(r'^edit_author/', views.author.edit),
url(r'^del_author/', views.author.delete),
]
/[project name]/urls.py
python框架之Django(2)-简单的CRUD的更多相关文章
- python框架之django
python框架之django 本节内容 web框架 mvc和mtv模式 django流程和命令 django URL django views django temple django models ...
- 第六篇:web之python框架之django
python框架之django python框架之django 本节内容 web框架 mvc和mtv模式 django流程和命令 django URL django views django te ...
- Python框架之Django学习
当前标签: Django Python框架之Django学习笔记(十四) 尛鱼 2014-10-12 13:55 阅读:173 评论:0 Python框架之Django学习笔记(十三) 尛 ...
- Python框架之Django的相册组件
Python框架之Django的相册组件 恩,没错,又是Django,虽然学习笔记已经结贴,但是学习笔记里都是基础的,Django的东西不管怎么说还是很多的,要学习的东西自然不会仅仅用十几篇博文就能学 ...
- Python框架之Django学习笔记(十一)
话说上次说到数据库的基本访问,而数据库我们主要进行的操作就是CRUD,也即是做计算处理时的增加(Create).读取(Retrieve)(重新得到数据).更新(Update)和删除(Delete),俗 ...
- Python框架之Django学习笔记(十四)
Django站点管理(续·完) 本想昨天更新的,谁曾想昨天竟然是工作日!我就不吐槽昨天加班到十一点多了,需求增加无疑让我等蛋疼不已,忽而想起一首打油诗: 明月几时有,把酒问群友.不知这次版本,今晚能出 ...
- python框架之Django(14)-rest_framework模块
APIView django原生View post请求 from django.shortcuts import render, HttpResponse from django import vie ...
- Python框架之Django学习笔记(十二)
Django站点管理 十一转眼结束,说好的充电没能顺利开展,反而悠闲的看了电视剧以及去影院看了新上映的<心花路放>.<亲爱的>以及<黄金时代>,说好的劳逸结合现在回 ...
- Python框架之Django学习笔记(十)
又是一周周末,如约学习Django框架.在上一次,介绍了MVC开发模式以及Django自己的MVT开发模式,此次,就从数据处理层Model谈起. 数据库配置 首先,我们需要做些初始配置:我们需要告诉D ...
随机推荐
- Java动态代理的实现机制
一.概述 代理是一种设计模式,其目的是为其他对象提供一个代理以控制对某个对象的访问,代理类负责为委托类预处理消息,过滤消息并转发消息以及进行消息被委托类执行后的后续处理.为了保持行为的一致性,代理类和 ...
- 在centos7 ubuntu15.04 上通过bosh-lite 搭建单机环境cloudfoundry
Bosh-lite简介 bosh-lite 是一个单机部署cloudfoundry的实验性工具,用于开发人员做poc 验证.Bosh-lite目前支持仅MAC OS X和Linux系统.B ...
- 【前端积累】javascript事件
什么是事件? 事件是一种异步编程的实现方式,本质上是程序各个组成部分之间的通信.就是文档或浏览器窗口发生的一些特定的交互瞬间(某种动作). 1.事件流 事件流描述的是从页面中接收事件的顺序. 1)事件 ...
- Tomorrow Is A New Day
Sometimes we do not feel like we want to feel Sometimes we do not achieve what we want to achiev ...
- 原生js(一)
Element对象有以下重要属性: 1.style. a) Element的css样式 b) 可以通过elem.style.backgroundColor = "red"的形式才动 ...
- Android 编译时:m、mm、mmm、mma、mmma的区别
m:编译整个安卓系统 makes from the top of the tree mm:编译当前目录下的模块,当前目录下需要有Android.mk这个makefile文件,否则就往上找最近的Andr ...
- Email standards
https://www.fastmail.com/help/technical/standards.html Email structure These RFCs define the way ema ...
- sencha touch NavigationView 嵌套 TabPanel 的问题
在st2.1之中,在NavigationView视图之中在嵌套一个TabPanel会有以下问题 下面我们监控TabPanel的activate事件和activeitemchange事件 会发现当首页加 ...
- mvn deploy命令上传包
需求:有的时候需要单独上传release jar包,因为存在工程代码在A内网SVN,Nexus在B内网.这种情况下使用VPN也无法解决Jar包发布的问题. 这个时候采取的方式只能是: 打出jar包 - ...
- 在 arc里面打印 引用计数的方法
查阅资料: You can use CFGetRetainCount with Objective-C objects, even under ARC: NSLog(@"Retain c ...