Django小例子 – 模型数据的模板呈现
学习Django的这几天,学习过程还是很愉快的,django采用的MVC架构,学习曲线十分平缓,在深入学习之前,先简单的整理记录下django从数据库中获取数据并在模板中使用的方法。温故而知新 ^_^
首先假设一个简单的场景,数据库中存放着作者和书目的信息。这是一种多对多(ManyToMany)的结构,因为一个作者可以写多本书,一本书也可能由多个作者共同完成。我们如何使用Django来创建项目,配置数据库,创建视图,模板,配置URL路由,最后在浏览器访问我们动态创建的页面、
如下的部分算作是记录,也会简单的说明下Django的工作原理。入果是新手,估计看看也会有所收获,能对Django有个大概的了解。想系统的学习Django的小伙伴推荐你看《Django Book(中文版)》,这个文档有些年头,不过最近学习来看,原理和基本操作都没变,就是目录结构随着版本的升级发生变化,没啥大的影响,如英语可以,看Django官方文档当然是最好的。
假设你已经配置好了Django的环境。那么使用如下命令,创建我们的项目:
django-admin.py startproject project
cd project
python mamages.py startapp blog
这样我们就创建完成一个基本的项目了。来tree一下看看:
[root@Init-smile project]# tree
显示结果:
.
├── blog
│ ├── admin.py
│ ├── __init__.py
│ ├── migrations
│ │ └── __init__.py
│ ├── models.py
│ ├── tests.py
│ └── views.py
├── manage.py
└── project
├── __init__.py
├── settings.py
├── urls.py
└── wsgi.py 3 directories, 11 files
需要修改的文件是settings.py,在里面注册我们新建的APP,并且配置mysql数据库。找到
INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'blog'
)
添加APP,按如下的事例配置数据库,NAME,USER,PASSWORD换成你的。
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
#'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
'NAME': 'AuthBooks',
'USER': 'root',
'PASSWORD': '',
}
}
接下来,配置URL路由,修改urls.py,这个的作用就是匹配网址,提交给views.py进行处理
from django.conf.urls import patterns, include, url
from django.contrib import admin urlpatterns = patterns('',
# Examples:
# url(r'^$', 'project.views.home', name='home'),
# url(r'^blog/', include('blog.urls')), url(r'^admin/', include(admin.site.urls)),
url(r'^author/$', 'blog.views.show_author'),
url(r'^book/$', 'blog.views.show_book'),
)
这样,我们的网址如127.0.0.1/author和127.0.0.1/book就会对应进入不同的处理函数来对他们进行处理,接下来我们就编写views.py,实现相应功能。等等,在这之前,我们必须先了解下数据库,了解下如何建立数据,初始化表,获取数据。这样我们才能继续进行。在models.py模块中来定义我们的表如下,有Author,Book表,Author保存着作者名,Book保存着书名和作者名
from django.db import models # Create your models here. class Author(models.Model):
name = models.CharField(max_length=30) def __unicode__(self):
return self.name class Book(models.Model):
name = models.CharField(max_length=30)
authors = models.ManyToManyField(Author) def __unicode__(self):
return self.name
接下来,我们要初始化数据库。使用如下命令。
python manage.py syncdb
Operations to perform:
Apply all migrations: admin, contenttypes, auth, sessions
Running migrations:
Applying contenttypes.0001_initial… OK
Applying auth.0001_initial… OK
Applying admin.0001_initial… OK
Applying sessions.0001_initial… OK You have installed Django’s auth system, and don’t have any superusers defined.
Would you like to create one now? (yes/no):
这里问我们是不是建立一个管理账户。我们选择Yes,然后根据提示创建完成。去项目根目录看看是不是有一个名为db.sqlite3的数据库了~
接下来,我们通过项目提供的shell练习一下添加作者,书籍等数据。然后再到views.py模块中进行处理。
python manage.py shell
这样,我们就进入了一个django为我们配置好的shell环境,我们可以方便的导入相关的模块而不必担心not found问题。
接下来运行如下一系列命令。来为数据库添加记录
from blog.models import Author, Book
Author.objects.create(name='sin')
Author.objects.create(name='sun')
Author.objects.create(name='lin')
b1 = Book()
b1.name = 'book1'
b1.save()
b2 = Book()
b2.name = 'book2'
b2.save()
b3 = Book()
b3.name = 'book3'
b3.save()
sin = Author.objects.get(name__exact='sin')
sun = Author.objects.get(name__exact='sun')
lin = Author.objects.get(name__exact='lin')
b1.authors.add(sin)
b1.authors.add(sun)
b2.authors.add(sun)
b3.authors.add(sun)
b3.authors.add(lin)
根据上面的命令就可以建立起如下图所示的Authors-Books对应关系
补充一些常用命令
(根据书本查作者)
查询每本书对应的作者:
>>> b1.authors.all()
[<Author: sin>, <Author: sun>]
>>> b2.authors.all()
[<Author: sun>]
>>> b3.authors.all()
[<Author: sun>, <Author: lin>]
查询书中的指定作者看是否存在
b1.authors.filter(name__exact='sin')
删除书的作者:
b1.authors.remove(sun)
(根据作者查询他出的书)
>>> sin.book_set.all()
[<Book: book1>]
>>> sun.book_set.all()
[<Book: book1>, <Book: book2>, <Book: book3>]
>>> lin.book_set.all()
[<Book: book3>]
事实上,book_set相当于前面使用的objects
>>> sin.book_set.add(b3)
>>> sin.book_set.remove(b3)
>>> sin.book_set.all()
[<Book: book1>]
为作者添加新的书目:
sin.book_set.create(name='book4')
如上的命令都是封装好的数据库操作指令,所做的所有改动都会保存在数据库中。下面,就可以进行view.py的配置,和模板的编写,来在html上直观的显示出作者和书目的对应关系
view.py内容如下,它就是用来处理对应的URL都做什么,在这里是返回处理过的模板
from django.shortcuts import render_to_response
from blog.models import Author, Book # Create your views here. def show_author(request):
authors = Author.objects.all()
return render_to_response('show_author.html', {'authors':authors}) def show_book(request):
books = Book.objects.all()
return render_to_response('show_book.html', {'books':books})
在blog的目录下新建templates文件夹,这是系统默认的模板搜索路径,所以直接在里面新建show_author.html 内容如下:
{% for author in authors %}
<div>
<h3>{{ author.name }}</h3>
{% for book in author.book_set.all %}
<li>{{ book.name }}</li>
{% endfor %}
</div>
{% endfor %}
再建立show_book.html,内容如下:
{% for book in books %}
<h3>{{ book.name }}</h3>
<div>
{% for author in book.authors.all %}
<li>{{ author.name }}</li>
{% endfor %}
</div>
{% endfor %}
OK,如上就是构建django项目创建APP,配置数据库,添加数据,配置URL路由,编写视图,模板的所有内容了。
下面来运行我们的项目,并在浏览器端访问。
在project目录下运行:
python manage.py runserver
这样,你在本地通过127.0.0.1:8000/author和127.0.0.1:8000/book就可以看到效果了
如果你使用的虚拟机(桥接上网),那么可以使用如下命令
python manage.py runserver 0.0.0.0:80
如上就可以通过你的虚拟机IP地址进行访问了。(你可能需要使用iptables -F来临时关闭iptables)
好的,看看是不是和我的运行的结果一样呢~
整理完毕,继续下一步学习。
Django小例子 – 模型数据的模板呈现的更多相关文章
- django 学习-7 模型数据操作
1.首先还是创建办一个项目和一个应用 django.admin.py startproject ssj cd ssj django.admin.py startapp sdj 那 ...
- python Django教程 之 模型(数据库)、自定义Field、数据表更改、QuerySet API
python Django教程 之 模型(数据库).自定义Field.数据表更改.QuerySet API 一.Django 模型(数据库) Django 模型是与数据库相关的,与数据库相关的代码 ...
- django 简易博客开发 2 模板和数据查询
首先还是贴一下项目地址 https://github.com/goodspeedcheng/sblog 因为代码全在上面 上一篇博客我们介绍了 django的安装配置,新建project,新建a ...
- Django 小实例S1 简易学生选课管理系统 9 创建课程模型(model)
Django 小实例S1 简易学生选课管理系统 第9节--创建课程模型(model) 点击查看教程总目录 作者自我介绍:b站小UP主,时常直播编程+红警三,python1对1辅导老师. 对于课程模块, ...
- c/c++ 模板与STL小例子系列<三> traits
c/c++ 模板与STL小例子系列 traits 对这个概念,还是处于懵逼的状态,初步体会就是,为了解决类型之间的转换问题. 从一个类型为A的指针,转化到类型为B的指针,中间需要用void*来作为中介 ...
- c/c++ 模板与STL小例子系列<二> 模板类与友元函数
c/c++ 模板与STL小例子系列 模板类与友元函数 比如某个类是个模板类D,有个需求是需要重载D的operator<<函数,这时就需要用到友元. 实现这样的友元需要3个必要步骤 1,在模 ...
- c/c++ 模板与STL小例子系列<一 >自建Array数组
c/c++ 模板与STL小例子系列 自建Array数组 自建的Array数组,提供如下对外接口 方法 功能描述 Array() 无参数构造方法,构造元素个数为模板参数个的数组 Array(int le ...
- Django 小实例S1 简易学生选课管理系统 3 创建用户模型(model)
Django 小实例S1 简易学生选课管理系统 第3节--创建用户模型(model) 点击查看教程总目录 作者自我介绍:b站小UP主,时常直播编程+红警三,python1对1辅导老师. 本文涉及到的新 ...
- Django框架3——模型
Django数据库层解决的问题 在本例的视图中,使用了pymysql 类库来连接 MySQL 数据库,取回一些记录,将它们提供给模板以显示一个网页: from django.shortcuts imp ...
随机推荐
- A*寻路算法lua实现
前言:并在相当长的时间没有写blog该,我觉得有点"颓废"该,最近认识到各种同行,也刚刚大学毕业,我认为他们是优秀的.认识到与自己的间隙,有点自愧不如.我没有写blog当然,部分原 ...
- Different ways of associating known types in wcf
解释一下这个博客Known Types此属性标签,假设翻译的单词,所谓已知类型它.在服务契约中实现多态的行为.有四种方式实现,以下来分别演示一下. 1.User KnownType attribute ...
- 学习笔记 一步步了解webpack
前言 demo 地址: https://github.com/yy8597/webpack-demos 之前学习了 broswerify,发现确实很好用.虽然没有 grunt 那样丰富的配置和插件,但 ...
- crontab演出newLISP脚本设置环境变量
今天遇到一个问题.执行在终端newLISP文字,一切正常,搬去crontab在将无法正常工作.即使crontab -e命令是在同一个用户执行.还是有问题. 因为newLISP脚本使用hive和hado ...
- hdu4699 Editor 2013 多校训练第十场 D题 数列维护 splay | 线段树 | 栈!!!!!
题意:维护一个文本编辑,并且查询最大前缀和. 写了splay,wa了13次 过了之后觉着特傻逼.发现题解两个栈就可以了,光标前后维护两个栈,维护前面的栈的前缀和 和 最大前缀和. 哎,傻逼,太弱了,还 ...
- ABP之动态WebAPI
ABP之动态WebAPI ABP的动态WebApi实现了直接对服务层的调用(其实病没有跨过ApiController,只是将ApiController公共化,对于这一点的处理类似于MVC,对服务端的 ...
- javascript系列之变量对象
原文:javascript系列之变量对象 引言 一般在编程的时候,我们会定义函数和变量来成功的构造我们的系统.但是解析器该如何找到这些数据(函数,变量)呢?当我们引用需要的对象时,又发生了什么了? 很 ...
- SVN有用教程
好用的Windows下SVNclient——Tortoise SVN的下载地址: http://tortoisesvn.tigris.org/ 文档: http://www.subversion.or ...
- Swift中文教程(六)--枚举和结构
原文:Swift中文教程(六)--枚举和结构 Enumerations 枚举 使用 enum 来创建一个枚举.跟Classes(类)和其他类型的命名方式一样,枚举也可以有Method(方法). enu ...
- javascript中类的属性研究
原文:javascript中类的属性研究 本篇文章主要针对javascript的属性进行分析,由于javascript是一种基于对象的语言,本身没有类的概念,所以对于javascript的类的定义有很 ...