3.4Django模板、视图、url的使用

你们的歌里没有酒,我去醉的像条狗。

目录

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 模板




   首页


    

图书列表

(5) 定义 detail.html 模板
在模板中访问对象成员时,都以属性的方式访问,即方法也不能加括号




详细页


{{book.btitle}}

    {%for hero in book.heroinfo_set.all%}
  • {{hero.hname}}---{{hero.hcontent}}
  • {%endfor%}

_____________________________________________

2.视图

 在 django 中,视图对 WEB 请求进行回应
 视图就是一个 Python 函数,被定义在 views.py 中
 视图接收 reqeust 对象作为第一个参数,包含了请求的信息

#coding:utf-8
from django.http import HttpResponse
def index(request):
return HttpResponse("home page test.")

代码说明:

  1. 第一行是声明编码为 utf-8, 因为我们在部分代码中用到了中文,如果不声明就报错.
  2. 第二行引入 HttpResponse,它是用来向网页返回内容的,就像 Python 中的print 一样,只不过 HttpResponse 是把内容显示到网页上。
  3. 我们定义了一个 index()函数,第一个参数必须是 request,与网页发来的请求有关, request 变量里面包含 get 或 post 的内容,用户浏览器,系统等信息在里面。
  4. 函数返回了一个 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)

—————————————————————————

好了,今天的知识说的有点杂乱,如果不适合大家的话,可以从中提取自己需要的内容!看完了文章点点关注吧!写总结已经成为习惯!

你可能感兴趣的:(3.4Django模板、视图、url的使用)