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 ...
随机推荐
- 【LeetCode OJ】Add Two Numbers
题目:You are given two linked lists representing two non-negative numbers. The digits are stored in re ...
- no matching function for call to ‘std::basic_string<char>::assign(std::string&, int)
使用string中的assign赋值函数报错,代码为: text0.assign(line,i+); 其中text0与line都为string类型 最后发现assign函数的原型为 string &a ...
- 【小程序+thinkphp5】 用户登陆,返回第三方session3rd
服务器环境: centos7 php7.0 准备工作: 注册小程序,并获取 appid .appsecret 下载微信解密算法sdk : https://mp.weixin.qq.com/debu ...
- python爬虫---->github上python的项目
这里面通过爬虫github上的一些start比较高的python项目来学习一下BeautifulSoup和pymysql的使用.我一直以为山是水的故事,云是风的故事,你是我的故事,可是却不知道,我是不 ...
- Makefile 链接静态库
Linux的静态库是以.a结尾的,要连接静态库有两种方法,一种是在编译命令最后直接加上库路径/库名称. 例如你的库在绝对目录/lib/libtest.a下面你就可以这样来编译$(CC) $(CFLAG ...
- js 的空值判断程序
function empty(v){ switch (typeof v){ case 'undefined' : return true; case 'string' : if($.trim(v).l ...
- 开发常见错误之 :Missing artifact com.sun:tools:jar 1.7.0
Missing artifact com.sun:tools:jar 1.7.0 解决办法一: 手动配置pom.xml,添加一个dependency如下: <dependency> < ...
- if中的-n -z linux_Shell
==========1 混淆的-n -z================= -n 表示这个变量或者字符串是否不为空.-z 表示这个变量或者字符串为空 上面这两句话中最重要的点是不通的 -n 关注的是 ...
- linux下的一些操作命令
1.切换到root账号下: su root 输入密码: 2.修改root账号密码: sudo passwd root 输入密码: 3.cat用法: 查看文件内容 cat 文件名 创建文件 ...
- Word 2013无法启用Restrict Editing解决方法
当前文档可能是Mail Merge Letter type document,MAILINGS -> Start Mail Merge -> Normal Word Document保存即 ...