整体框架
client
发送请求
django server
接收请求,查找响应方法
urls.py
调用方法
views.py
访问数据库 -->models
获取页面资源-->templates
models.py
获取数据库数据
templates
生成 html 返回 html到client
client
数据表间表间关系
为了保证数据完整性,关系数据库通过主外建实现了表之间的关系
主键
表中一个或多个字段,它的值用于唯一地标表中的某一条记录
两个表关系中,主键用来在一个表中引用来自于另一个表中的特定记录
主键是一种唯一关键字,表定义的一部分
一个表不能有多个主键,并且主键的列不能包含空值
外键
如果公共字段在一个关系中是主键,那么这个公公字段被称为另一个关系的外键
由此可见,外键表示了两个关系之间的相关联系
主表与子表
凭借另一个关系的外键作主关键字的表被称为主表
具有此外的表被称为主表的从表
实现关系型数据库的关系
关系数据库中,表之间的关系
一对一
django.db.models.OneToOneField
e.g 每个人只有一张身份证
一对多/多对一
django.db.models.ForeignKey
e.g 汽车只能有一个制造商,但是一个制造商可以有多辆汽车
多对多
django.db.models.ManyToManyField
e.g 学生可以选择多门课程,每门课程下有多个学生
框架搭建
创建模型
models.py
from django.db import models
class Tag(models.Model):
tag_name = models.CharField(max_length=20)
create_time = models.DateTimeField(auto_now_add=True)
def __unicode__(self):
return self.tag_name
class Classification(models.Model):
name = models.CharField(max_length=20)
def __unicode__(self):
return self.name
class Author(models.Model):
name = models.CharField(max_length=30)
email = models.EmailField(blank=True)
website = models.URLField(blank=True)
def __unicode__(self):
return u'%s' % (self.name)
class Article(models.Model):
caption = models.CharField(max_length=30)
subcaption = models.CharField(max_length=50,blank=True)
publish_time = models.DateTimeField(auto_now_add=True)
update_time = models.DateTimeField(auto_now=True)
author =models.ForeignKey(Author)
classification = models.ForeignKey(Classification)
tags = models.ManyToManyField(Tag,blank=True)
content = models.TextField()
创建视图方法
from myblog.models import Article,Tag,Classification from django.shortcuts import render_to_response from django.template import RequestContext #render_to_response主要用于渲染页面返回页面数据 #order_by排序 “-”减号是倒叙 def blog_list(request): blogs = Article.objects.all().order_by('-publish_time') return render_to_response('index.html', { "blogs":blogs}, context_instance=RequestContext(request)) def blog_detail(request): if request.method == 'GET': id = request.GET.get('id',''); try: blog = Article.objects.get(id=id) except Article.DoesNotExist: raise Http404 return render_to_response("detail.html",{"blog":blog},context_instance=RequestContext(request)) else: raise Http404
创建博客首页面模版
<html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>AuroraBlog</title> <link href="/static/css/dblog.css" rel="stylesheet" type="text/css" /> </head> <body> <div class="container"> <div class="header"> <div id="top"> <a href="/blog"><img src="/static/image/LOGO.png" alt="LOGO" name="logo" width="400" height="300" id="logo" /></a> <div id="nav_div"> <ul id="top_nav"> <li><a href="/" class="a_normal">首页</a></li> <li><a href="#" class="a_normal">订阅</a></li> <li><a href="#" class="a_normal">关于</a></li> </ul> </div> </div> <!-- end .header --></div> <div class="content_body"> <div class="main_body"> {% for blog in blogs %} <div class="blog_body"> <div class="blog_title"><a href="/detail/?id={{ blog.id }} ">{{ blog.caption }}</a></div> <div class="blog_info1"> <span class="blog_info1_list"> <span class="li_small_1">分类,<a href="#">{{ blog.classification }}</a></span> <span class="li_small_1">发表时间 : {{ blog.publish_time|date:"Y-m-d H:i" }}</span> </span> </div> <div class="blog_splitline"></div> <div class="blog_description">{{ blog.content }}</div> <div class="blog_info2"> <span class="blog_info2_list"> <span class="li_small_2">标签:{% for tag in blog.tags.all %}<a href="#">{{ tag.tag_name}}</a>{% endfor %} </span> </div> </div> {% endfor %} </div> </div> </div class="footer"> </div id="footer_logo"></div> <div id="siteinfo">© 2007 - 2012 AuroraWork Project</div> <!-- end .footer --><div> <!-- end .container --></div> </body> </html>
添加静态文件
static
css
image
设置settings
STATIC_URL = '/static/'
STATICFILES_DIRS = [
BASE_DIR +'/static/',
]
设置首页路径
templates =
DIRS : [r'']
#index.html存放路径