美文网首页
3.4Django模板、视图、url的使用

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

作者: 昵称又重复 | 来源:发表于2018-04-26 11:15 被阅读149次
    你们的歌里没有酒,我去醉的像条狗。
    

    目录

    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.")
    

    代码说明:

    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的使用

          本文链接:https://www.haomeiwen.com/subject/eiqplftx.html