一、表的设计

from django.db import models

# Create your models here.

class Book(models.Model):
title = models.CharField(max_length=32, verbose_name='书名')
price = models.DecimalField(max_digits=8, decimal_places=2, verbose_name='价格')
publish_date = models.DateField(auto_now_add=True, verbose_name='出版时间')
publish = models.ForeignKey(to='Publish')
author = models.ManyToManyField(to='Author') class Publish(models.Model):
name = models.CharField(max_length=32, verbose_name='出版社名')
addr = models.CharField(max_length=64, verbose_name='出版社地址')
email = models.EmailField(verbose_name='邮箱地址') class Author(models.Model):
name = models.CharField(max_length=32, verbose_name='作者名')
age = models.IntegerField(verbose_name='年龄')
author_detail = models.OneToOneField(to='AuthorDetail') class AuthorDetail(models.Model):
phone = models.BigIntegerField(verbose_name='手机号')
addr = models.CharField(max_length=64, verbose_name='作者住址')

models.py

二、路由层(url.py)

urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^$', views.home, name='home'),
url(r'^book/list/', views.book_list, name='book_list'),
# 书籍增加
url(r'^book/add/', views.book_add, name='book_add'),
# 书籍的编辑
url(r'^book/edit/(?P<edit_id>\d+)', views.book_edit, name='book_edit'),
# 书籍的删除
url(r'^book/delete/(\d+)', views.book_delete, name='book_delete')
]

三、视图层(views.py)

def home(request):
return render(request, 'home.html') def book_list(request):
book_query = models.Book.objects.all()
return render(request, 'book_list.html', locals()) # 书籍增加
def book_add(request):
if request.method == 'POST':
print(request.POST)
title = request.POST.get('title')
price = request.POST.get('price')
publish_date = request.POST.get('publish_date')
publish_id = request.POST.get('publish')
author_list = request.POST.getlist('author')
# 操作数据库存储数据
# 书籍表
book_obj = models.Book.objects.create(title=title, price=price, publish_date=publish_date,
publish_id=publish_id)
# 书籍与作者的关系表
book_obj.author.add(*author_list) # *将列表打散
# 跳转到书籍的展示页面
'''
redirect括号内可以直接写url
也可以直接写别名 但是别名需要额外的参数,就必须使用reverse解析
'''
return redirect('book_list')
# 获取当前系统所有的出版社和作者信息
publish_queryset = models.Publish.objects.all()
author_queryset = models.Author.objects.all()
return render(request, 'book_add.html', locals()) def book_edit(request, edit_id):
if request.method == 'POST':
title = request.POST.get('title')
price = request.POST.get('price')
publish_date = request.POST.get('publish_date')
publish_id = request.POST.get('publish')
author_list = request.POST.getlist('author')
models.Book.objects.filter(pk=edit_id).update(title=title, price=price, publish_date=publish_date,
publish_id=publish_id)
# 修改第三张表
book_obj = models.Book.objects.filter(pk=edit_id).first()
book_obj.author.set(author_list)
return redirect('book_list')
# 获取当前用户想要编辑的书籍对象,展示给用户看
edit_obj = models.Book.objects.filter(pk=edit_id).first()
publish_queryset = models.Publish.objects.all()
author_queryset = models.Author.objects.all()
return render(request, 'book_edit.html', locals()) def book_delete(request, delete_id):
models.Book.objects.filter(pk=delete_id).delete()
return redirect('book_list')

四、首页页面

def home(request):
return render(request, 'home.html') def book_list(request):
book_query = models.Book.objects.all()
return render(request, 'book_list.html', locals()) # 书籍增加
def book_add(request):
if request.method == 'POST':
print(request.POST)
title = request.POST.get('title')
price = request.POST.get('price')
publish_date = request.POST.get('publish_date')
publish_id = request.POST.get('publish')
author_list = request.POST.getlist('author')
# 操作数据库存储数据
# 书籍表
book_obj = models.Book.objects.create(title=title, price=price, publish_date=publish_date,
publish_id=publish_id)
# 书籍与作者的关系表
book_obj.author.add(*author_list) # *将列表打散
# 跳转到书籍的展示页面
'''
redirect括号内可以直接写url
也可以直接写别名 但是别名需要额外的参数,就必须使用reverse解析
'''
return redirect('book_list')
# 获取当前系统所有的出版社和作者信息
publish_queryset = models.Publish.objects.all()
author_queryset = models.Author.objects.all()
return render(request, 'book_add.html', locals()) def book_edit(request, edit_id):
if request.method == 'POST':
title = request.POST.get('title')
price = request.POST.get('price')
publish_date = request.POST.get('publish_date')
publish_id = request.POST.get('publish')
author_list = request.POST.getlist('author')
models.Book.objects.filter(pk=edit_id).update(title=title, price=price, publish_date=publish_date,
publish_id=publish_id)
# 修改第三张表
book_obj = models.Book.objects.filter(pk=edit_id).first()
book_obj.author.set(author_list)
return redirect('book_list')
# 获取当前用户想要编辑的书籍对象,展示给用户看
edit_obj = models.Book.objects.filter(pk=edit_id).first()
publish_queryset = models.Publish.objects.all()
author_queryset = models.Author.objects.all()
return render(request, 'book_edit.html', locals()) def book_delete(request, delete_id):
models.Book.objects.filter(pk=delete_id).delete()
return redirect('book_list')

home.html

五、图书展示页面(book_list.html)

{% extends 'home.html' %}

{% block content %}
<a href="{% url 'book_add' %}" class="btn-success">添加</a>
<br>
<table class="table table-hover table-striped">
<thead>
<tr>
<th>ID</th>
<th>书名</th>
<th>价格</th>
<th>出版日期</th>
<th>出版社</th>
<th>作者</th>
<th>操作</th>
</tr>
</thead>
<tbody>
{% for book_obj in book_query %}
<tr>
<td>{{ book_obj.pk }}</td>
<td>{{ book_obj.title }}</td>
<td>{{ book_obj.price }}</td>
<td>{{ book_obj.publish_date|date:'Y-m-d' }}</td>
<td>{{ book_obj.publish.name }}</td>
<td>
{% for author_obj in book_obj.author.all %}
{% if forloop.last %}
{{ author_obj.name }}
{% else %}
{{ author_obj.name }},
{% endif %}
{% endfor %} </td>
<td>
<a href="{% url 'book_edit' book_obj.pk %}" class="btn btn-primary btn-xs">编辑</a>
<a href="{% url 'book_delete' book_obj.pk %}" class="btn btn-primary btn-xs">删除</a>
</td>
</tr>
{% endfor %} </tbody>
</table>
{% endblock %}

六 图书增加(book_add.html)

{% extends 'home.html' %}

{% block content %}
<h1 class="text-center">书籍添加</h1>
<form action="" method="post">
<p>书名:
<input type="text" name="title" class="form-control">
</p>
<p>价格:
<input type="text" name="price" class="form-control">
</p>
<p>出版日期:
<input type="date" name="publish_date" class="form-control">
</p>
<p>出版社:
<select name="publish" id="" class="form-control">
{% for publish_obj in publish_queryset %}
<option value="{{ publish_obj.pk }}">{{ publish_obj.name }}</option>
{% endfor %} </select>
</p>
<p>作者:
<select name="author" id="" multiple class="form-control">
{% for author_obj in author_queryset %}
<option value="{{ author_obj.pk }}">{{ author_obj.name }}</option>
{% endfor %} </select>
</p>
<input type="submit" value="新增" class="btn btn-primary btn-block">
</form>
{% endblock %}

七 图书编辑(book_edit.html)

{% extends 'home.html' %}

{% block content %}
<h1 class="text-center">书籍编辑</h1>
<form action="" method="post">
<p>书名:
<input type="text" name="title" class="form-control" value="{{ edit_obj.title }}">
</p>
<p>价格:
<input type="text" name="price" class="form-control" value="{{ edit_obj.price }}">
</p>
<p>出版日期:
<input type="date" name="publish_date" class="form-control"
value="{{ edit_obj.publish_date|date:'Y-m-d' }}">
</p>
<p>出版社:
<select name="publish" id="" class="form-control">
{% for publish_obj in publish_queryset %}
{# 针对当前书籍对象的出版社应该默认选中 #}
{% if edit_obj.publish == publish_obj %}
<option value="{{ publish_obj.pk }}" selected>{{ publish_obj.name }}</option>
{% else %}
<option value="{{ publish_obj.pk }}">{{ publish_obj.name }}</option>
{% endif %} {% endfor %} </select>
</p>
<p>作者:
<select name="author" id="" multiple class="form-control">
{% for author_obj in author_queryset %}
{% if author_obj in edit_obj.author.all %}
<option value="{{ author_obj.pk }}" selected>{{ author_obj.name }}</option>
{% else %}
<option value="{{ author_obj.pk }}" >{{ author_obj.name }}</option>
{% endif %} {% endfor %} </select>
</p>
<input type="submit" value="确定编辑" class="btn btn-info btn-block">
</form>
{% endblock %}

django(图书管理系统)的更多相关文章

  1. Django——图书管理系统

    基于Django的图书管理系统 1.主体功能 1.列出图书列表.出版社列表.作者列表 2.点击作者,会列出其出版的图书列表 3.点击出版社,会列出旗下图书列表 4.可以创建.修改.删除 图书.作者.出 ...

  2. Django(图书管理系统1)

    day63 内容回顾     1. 单表的增删改查         1. 删和改             1. GET请求 URL传值                 1. 格式            ...

  3. Django图书管理系统(前端对数据库的增删改查)

    图书管理系统 出版社的管理 源码位置:https://gitee.com/machangwei-8/learning_materials/tree/master/%E9%A1%B9%E7%9B%AE/ ...

  4. django 图书管理系统

    一.图书管理系统 单表的增删改查 1.创建项目 2.注释掉中间件 就可以提交post 请求 3.配置静态文件 并手动创建static 文件夹存放静态文件  二.具体的数据库配置 1.创建数据库  2. ...

  5. Django图书管理系统(前端对有外键的数据表增删改查)

    图书管理 书籍管理 book name 项目源码位置:https://gitee.com/machangwei-8/learning_materials/tree/master/%E9%A1%B9%E ...

  6. django图书管理系统实例

    首页,其他页面全部继承首页的上半部分 点击发布图书页面 首页点击书名,跳转到图书信息界面,该界面可删除图书 项目结构 #views.py from django.shortcuts import re ...

  7. Django(图书管理系统2)

    day64 内容回顾     1. ORM外键操作         图书表和出版社表  多对一 的关系              # 书     class Book(models.Model):   ...

  8. Django图书管理系统(单表操作)

    以下内容需要掌握: Python3 以及前端:HTML,CSS,jQuery,BootStrap,Django,JavaScript 开启Django新项目: 1,settings.py 数据库选择: ...

  9. Django练习——图书管理系统

    Django图书管理系统 创建一个项目 1. django-admin startproject 图书管理 2. cmd 命令终端下创建一个app python manage.py startapp ...

  10. 在Django中使用ORM创建图书管理系统

    一.ORM(对象关系映射) 很多语言的web框架中都有这个概念 1. 为什么要有ORM? 1. 写程序离不开数据,要使用数据就需要连接数据库,但是不同的数据库在sql语句上(mysql,oracle等 ...

随机推荐

  1. Python之读取Excel

    介绍 现在交给你一份2010年美国各州县人口普查表:censuspopdata.xlsx.共72864条记录. 每一行代表一个县某统计区的人口数. 需要你统计出:各县统计区数量和人口数. 表格内容长这 ...

  2. CDN 加速原理

    => CDN 加速原理 HTTP 请求流程说明: 用户在浏览器输入要访问的网站域名,向本地 DNS 发起域名解析请求. 域名解析的请求被发往网站授权 DNS 服务器. 网站 DNS 服务器解析发 ...

  3. mysql中如何批量生成百万级数据

    # 准备 #1. 准备表 create table s1( id int, name varchar(20), gender char(6), email varchar(50), first_nam ...

  4. django学习第五天---model类的属性参数,单表ORM数据库增删改查动作,查询的13个API接口

    model类的属性参数 比如:models.CharField(null=True,blank=True) (1)null 如果为True,Django将用NULL在数据库中存储空值.默认值时Fals ...

  5. Execl常用快捷操作

    常用的操作 Ctrl+A 全选 Ctrl+Z 撤销 Ctrl+X 剪切 Ctrl+C 复制 Ctrl+V 粘贴 Ctrl+B 加粗 Ctrl+S 保存 Ctrl+F 查找 Ctrl+H 替换 Alt+ ...

  6. vim创建sh文件自动生成头信息

    >>> vim /etc/vimrc 或 vim ~/.vimrc " 这几个加不加都行 set tabstop=4 set softtabstop=4 set shift ...

  7. 阿尔萨斯(Arthas)入门

    目录 简介 Arthas(阿尔萨斯) 能为你做什么 安装 快速安装 全量安装 卸载 使用 启动arthas 查看dashboard 通过thread命令来获取到arthas-demo进程的Main C ...

  8. redis-cluster 性能调优

    关闭RDB防止fork进程的内存溢出问题 save "" appendonly=yes 防止某个节点挂掉,整个cluster挂掉的问题 cluster-require-full-c ...

  9. Frechet Inception Distance

    (以下内容重新更新,主要讲解FID的意义,为何FID能够表示生成图像的多样性和质量,为什么FID越小,则图像多样性越好,质量也越好) 在计算FID中我们也同样使用inception network网络 ...

  10. [C++/QT] 获取进程完整路径

    气哭我了,我不就获取一下进程路径嘛,,,绕了好大一圈 主要是用到了GetModuleFileNameEx() 函数 食用方式如下 HANDLE hProcess = OpenProcess(PROCE ...