你们的歌里没有酒,我去醉的像条狗。
目录
1.关联集合 | 2.视图 |
---|---|
3.WEB 响应 | 4.Render 简写 |
5.注意 | 6.URLconf |
7.站点管理(细讲管理员) | 7.1创建管理员 |
7.2界面本地化 | 7.3自定义管理页面 |
7.4管理BookInfor对象 |
在正式都这篇文章之前,我给大家解释一下,下面文章中会多次提到BookInfo和HeroInfo ,还有一些表的数据字段。这是我为了写东西而建立两张数据表。我不希望大家一头雾水的看着熟悉而不理解的东西。讲这块知识拿例子来讲还是比较容易讲清楚了,不然我真的不知该如何给大家说这块儿的知识了。有说的不好的地方,请大家见谅,可以私信我,及时改正! 好了,下面就开启你的吸血大法吸取内容吧!
1.关联集合
获得关联集合:顾名思义就是把集合关联起来,通过查找一个集合中的数据,然后将另外一个集合的数据也找出来到。用比较官方的话来说就是:返回当前 某个(book) 对象的所有内容(hero)
b = HeroInfo
h1= b.heroinfo_set.all()[0]
h1.hname
django 默认每个主表的对象都有一个是外键的属性,可以通过它来查询到子表的信息。
这个属性的名称默认是以子表的名称小写加上_set 来表示,例如(heroinfo_set)
默认返回的是一个 querydict 对象
有一个 HeroInfo 存在,必须要有一个 BookInfo 对象,提供了创建关联的数据:
h=b.heroinfo_set.create(hname=u'黄蓉',hgender=False,hcontent=u'打狗棍法')
模板是 html 页面,可以根据视图中传递的数据填充值
(1)在网站目录下创建 templates 子目录
(2) 修改 settings.py 文件,设置 TEMPLATES 的 DIRS 值:
'DIRS': [os.path.join(BASE_DIR, 'templates')]
(3)在模板中访问视图传递的数据
{{输出值}} #可以是变量,也可以是对象.属性
{%执行代码段%}
(4) 定义 index.html 模板
<!DOCTYPE html>
<html>
<head>
<title>首页</title>
</head>
<body>
<h1>图书列表</h1>
<ul>
{%for book in booklist%}
<li> <a href="{{book.id}}"> {{book.btitle}} </a> </li>
{%endfor%}
</ul>
</body>
</html>
(5) 定义 detail.html 模板
在模板中访问对象成员时,都以属性的方式访问,即方法也不能加括号
<!DOCTYPE html>
<html>
<head>
<title>详细页</title>
</head>
<body>
<h1>{{book.btitle}}</h1>
<ul>
{%for hero in book.heroinfo_set.all%}
<li>{{hero.hname}}---{{hero.hcontent}}</li>
{%endfor%}
</ul>
</body>
</html>
_____________________________________________
2.视图
在 django 中,视图对 WEB 请求进行回应
视图就是一个 Python 函数,被定义在 views.py 中
视图接收 reqeust 对象作为第一个参数,包含了请求的信息
#coding:utf-8
from django.http import HttpResponse
def index(request):
return HttpResponse("home page test.")
代码说明:
- 第一行是声明编码为 utf-8, 因为我们在部分代码中用到了中文,如果不声明就报错.
- 第二行引入 HttpResponse,它是用来向网页返回内容的,就像 Python 中的print 一样,只不过 HttpResponse 是把内容显示到网页上。
- 我们定义了一个 index()函数,第一个参数必须是 request,与网页发来的请求有关, request 变量里面包含 get 或 post 的内容,用户浏览器,系统等信息在里面。
- 函数返回了一个 HttpResponse 对象,可以经过一些处理,最终显示数据到网页上。
_____________________________________________
3.WEB 响应
我们在前面已经做了大部分工作了,接下来就该显示了。
from django.http import HttpResponse
from django.template import RequestContext, loader
from booktest.models import BookInfo
def index(request):
#获取图书表中所有的记录
booklist = BookInfo.objects.all()
#加载 index.html
template = loader.get_template('booktest/index.html')
#字典,用于插入模版中的数据
context = {'booklist': booklist}
#返回模版渲染的结果
return HttpResponse(template.render(context))
def detail(reqeust, id):
book = BookInfo.objects.get(pk=id)
template = loader.get_template('booktest/detail.html')
context = {'book': book}
return HttpResponse(template.render(context))
django.template.loader.get_template(template_name):
通过模板名参数,返回一个模板对象,如果模板不存在,报错 TemplateDoesNotExist 解决方法:查看是否在settings.py 中 TEMPLATE_DIRS 属性下添加的项目的名称。
____________________________________________
4.Render 简写(简写刚才web的代码)
Django 提供了函数 Render()简化视图调用模板、构造上下文
from django.shortcuts import render
from booktest.models import BookInfo
def index(reqeust):
booklist = BookInfo.objects.all()
return render(reqeust, 'booktest/index.html', {'booklist': booklist})
def detail(reqeust, id):
book = BookInfo.objects.get(pk=id)
return render(reqeust, 'booktest/detail.html', {'book': book})
简写之后的代码是不是比上面的代码简洁了很多呢?
_____________________________________________
5.注意
ImportError 问题
from models import BookInfo
报错:
ImportError:'No module named models'
改为:
from booktest.models import BookInfo
TypeError 问题
TypeError at /context must be a dict rather than RequestContext.
原因:版本问题
1.1 版本中可以直接传入 Context 对象,在 1.11 后只能传入字典
context = RequestContext(request,{'booklist': booklist})
return HttpResponse(template.render(context))
改为:
context = {'booklist': booklist}
return HttpResponse(template.render(context))
_____________________________________________
6.URLconf
Django 使用正则表达式匹配请求的 URL,一旦匹配成功,则调用应用的视图
在 Django 中,定义 URLconf 包括正则表达式、视图两部分
注意:只匹配路径部分,即除去域名、参数后的字符串
在 test1/urls.py 插入 booktest,使主 urlconf 连接到 booktest.urls 模块
url(r'^', include('booktest.urls')),
在 booktest 中的 urls.py 中添加 urlconf
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^$', views.index),
url(r'^([0-9]+)/$', views.detail),
]
urlpatterns 列表中来配置 url,每一个列表项就是一个由 url 函数的调用。
一个 project 中如果有多个 app,为避免 url 管理可能的混乱,在项目的 urls.py 用 include方法包含 myapp 中的 urls
_____________________________________________
7.站点管理(细讲管理员)
创建管理员
python manage.py createsuperuser
按提示输入用户名、邮箱、密码
启动服务器,默认通过“127.0.0.1:8000/admin” 访问,输入上面创建的用户名、密码完成登录
进入管理站点,默认可以对 groups、 users 进行管理
界面本地化
中文定制
编辑 settings.py 文件,设置编码、时区
默认值:
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'
修改为:
LANGUAGE_CODE = 'zh-Hans'
TIME_ZONE = 'Asia/Shanghai'
向 admin 注册 booktest 的模型
打开 booktest/admin.py 文件,注册模型
from django.contrib import admin
from models import BookInfo
admin.site.register(BookInfo)
刷新管理页面,可以对 BookInfo 的数据进行增删改查操作
自定义管理页面
Django 提供了 admin.ModelAdmin 类
通过定义 ModelAdmin 的子类,来定义模型在 Admin 界面的显示方式
#encoding:utf-8
from django.contrib import admin
from models import BookInfo
class BookInfoAdmin(admin.ModelAdmin):
#list_display:显示字段,可以点击列头进行排序
list_display = ['id', 'btitle', 'bpub_date']
# list_filter: 过滤字段,过滤框会出现在右侧
list_filter = ['btitle']
# search_fields: 搜索字段,搜索框会出现在上侧
search_fields = ['btitle']
# list_per_page:分页,分页框会出现在下侧
list_per_page = 2
# fieldsets:属性分组
fieldsets = [
('基本信息', {'fields': ['btitle']}),
('更多信息', {'fields': ['bpub_date']}),
]
关联 BookInfor 对象
英雄和书是多对一的关系
from django.contrib import admin
from models import BookInfo,HeroInfo
class HeroInfoInline(admin.StackedInline):
model = HeroInfo
extra = 2 #额外显示关联的记录数
class BookInfoAdmin(admin.ModelAdmin):
inlines = [HeroInfoInline]
admin.site.register(BookInfo, BookInfoAdmin)
—————————————————————————
好了,今天的知识说的有点杂乱,如果不适合大家的话,可以从中提取自己需要的内容!看完了文章点点关注吧!写总结已经成为习惯!
网友评论