zoukankan      html  css  js  c++  java
  • 1 Django

    1 django

     

    1.MVC

    • 大部分开发语言中都有MVC框架
    • MVC框架的核心思想是:解耦
    • 降低各功能模块之间的耦合性,方便变更,更容易重构代码,最大程度上实现代码的重用
    • m表示model,主要用于对数据库层的封装
    • v表示view,用于向用户展示结果
    • c表示controller,是核心,用于处理请求、获取数据、返回结果

    2.MVT

    • Django是一款python的web开发框架
    • 与MVC有所不同,属于MVT框架
    • m表示model,负责与数据库交互
    • v表示view,是核心,负责接收请求、获取数据、返回结果
    • t表示template,负责呈现内容到浏览器

    3.创建虚拟环境

    • 创建:mkvirtualenv [虚拟环境名称]
    • 删除:rmvirtualenv [虚拟环境名称]
    • 进入:workon [虚拟环境名称]
    • 退出:deactivate
    • 所有的虚拟环境,都位于/home/.virtualenvs目录下
    python@ubuntu:~/Desktop$ mkvirtualenv h4
    python@ubuntu:~/.virtualenvs$ rmvirtualenv h4
    
    (h4) python@ubuntu:~/Desktop$ deactivate 
    python@ubuntu:~/Desktop$ 
    python@ubuntu:~/Desktop$ workon h4
    复制代码
    python@ubuntu:~/.virtualenvs$ pwd
    /home/python/.virtualenvs
    
    
    python@ubuntu:~/.virtualenvs$ ls
    get_env_details  postmkproject     premkproject     spider_py2
    h4               postmkvirtualenv  premkvirtualenv  tornado_py2
    initialize       postrmvirtualenv  prermvirtualenv
    postactivate     preactivate       py2
    postdeactivate   predeactivate     py3
    复制代码

      

    4.安装django

    复制代码
    pip list
    pip freeze
    
    建议安装1.8.2版本,这是一个稳定性高、使用广、文档多的版本
    pip install django==1.8.2
    
    查看版本:进入python shell,运行如下代码
    import django
    django.get_version()
    
    说明:使用pip install django命令进行安装时,会自动删除旧版本,再安装新版本
    复制代码

    5 创建项目

    • 命令django-admin startproject test1
    • 进入test1目录,目录结构如下图

         

    复制代码
    目录说明
    
    manage.py:一个命令行工具,可以使你用多种方式对Django项目进行交互
    内层的目录:项目的真正的Python包
    _init _.py:一个空文件,它告诉Python这个目录应该被看做一个Python包
    settings.py:项目的配置
    urls.py:项目的URL声明
    wsgi.py:项目与WSGI兼容的Web服务器入口
    复制代码

         

    6 创建应用

    • 在一个项目中可以创建一到多个应用,每个应用进行一种业务处理
    • 创建应用的命令:
    python manage.py startapp booktest
    python@ubuntu:~/Desktop/projects/test1$ workon h4
    (h4) python@ubuntu:~/Desktop/projects/test1$ python manage.py startapp booktest
    复制代码
    (h4) python@ubuntu:~/Desktop/projects/test1$ ll
    总用量 20
    drwxrwxr-x 4 python python 4096 1月  12 14:39 ./
    drwxrwxr-x 4 python python 4096 1月  12 14:36 ../
    drwxrwxr-x 3 python python 4096 1月  12 14:39 booktest/
    -rwxrwxr-x 1 python python  248 1月  12 14:16 manage.py*
    drwxrwxr-x 2 python python 4096 1月  12 14:39 test1/
    复制代码

    7.定义模型类

    复制代码
    from django.db import models
    
    class BookInfo(models.Model):
        btitle = models.CharField(max_length=20)
        bpub_date = models.DateTimeField()
    
    
    class HeroInfo(models.Model):
        hname = models.CharField(max_length=20)
        hgender = models.BooleanField()
        hcontent = models.CharField(max_length=100)
        hBook = models.ForeignKey('BookInfo')
    复制代码

     8.生成数据表

    • 激活模型:编辑settings.py文件,将booktest应用加入到installed_apps中

        

    应用列表

    • 生成迁移文件:根据模型类生成sql语句
    python manage.py makemigrations
    • 迁移文件被生成到应用的migrations目录

        

    迁移文件

    • 执行迁移:执行sql语句生成数据表
    python manage.py migrate

    9.测试数据操作

    进入python shell,进行简单的模型API练习
    python manage.py shell
    复制代码
    (h4) python@ubuntu:~/Desktop/projects/test1$ python manage.py shell
    Python 2.7.12 (default, Jul  1 2016, 15:12:24) 
    [GCC 5.4.0 20160609] on linux2
    Type "help", "copyright", "credits" or "license" for more information.
    (InteractiveConsole)
    >>> from booktest.models import *
    >>> BookInfo.objects.all()
    [<BookInfo: abc>]
    >>> 
    复制代码

    增删改查

    >>> from booktest.models import *
    >>> b=BookInfo()
    >>> b.btitle='abc'
    >>> from datetime import datetime
    >>> b.bpub_date=datetime(year=1990,month=1,day=12)
    >>> b.save()
    复制代码
    # 查询select
    >>> b = BookInfo.objects.get(pk=1)
    
    #修改
    >>> b.btitle="123"
    >>> b.save()
    
    #查询全部
    >>> BookInfo.objects.all()
    [<BookInfo: 123>]
    
    #删除
    >>> b.delete()
    >>> BookInfo.objects.all()
    []
    复制代码

      关联对象的操作

    • 对于HeroInfo可以按照上面的操作方式进行
    • 添加,注意添加关联对象
    h=HeroInfo()
    h.htitle=u'郭靖'
    h.hgender=True
    h.hcontent=u'降龙十八掌'
    h.hBook=b
    h.save()
    • 获得关联集合:返回当前book对象的所有hero
    b.heroinfo_set.all()
    • 有一个HeroInfo存在,必须要有一个BookInfo对象,提供了创建关联的数据:
    h=b.heroinfo_set.create(htitle=u'黄蓉',hgender=False,hcontent=u'打狗棍法')
    h

    10 使用django的管理

    • 创建一个管理员用户
    python manage.py createsuperuser,按提示输入用户名、邮箱、密码
    • 启动服务器,通过“127.0.0.1:8000/admin”访问,输入上面创建的用户名、密码完成登录
    • 进入管理站点,默认可以对groups、users进行管理

    11 管理界面本地化

    • 编辑settings.py文件,设置编码、时区
    LANGUAGE_CODE = 'zh-Hans'
    TIME_ZONE = 'Asia/Shanghai'

    12 向admin注册booktest的模型

    • 打开booktest/admin.py文件,注册模型
    from django.contrib import admin
    from models import BookInfo
    admin.site.register(BookInfo)
    • 刷新管理页面,可以对BookInfo的数据进行增删改查操作
    • 问题:如果在str方法中返回中文,在修改和添加时会报ascii的错误
    • 解决:在str()方法中,将字符串末尾添加“.encode('utf-8')”

     

     Model层

     13 自定义管理页面

    • Django提供了admin.ModelAdmin类
    • 通过定义ModelAdmin的子类,来定义模型在Admin界面的显示方式
    class QuestionAdmin(admin.ModelAdmin):
        ...
    admin.site.register(Question, QuestionAdmin)
      1)列表页属性
    • list_display:显示字段,可以点击列头进行排序
    list_display = ['pk', 'btitle', 'bpub_date']
    • list_filter:过滤字段,过滤框会出现在右侧
    list_filter = ['btitle']
    • search_fields:搜索字段,搜索框会出现在上侧
    search_fields = ['btitle']
    • list_per_page:分页,分页框会出现在下侧
    list_per_page = 10

     

       2) 添加、修改页属性

    • fields:属性的先后顺序
    fields = ['bpub_date', 'btitle']
    • fieldsets:属性分组
    fieldsets = [
        ('basic',{'fields': ['btitle']}),
        ('more', {'fields': ['bpub_date']}),
    ]

     

     14  关联对象

    • 对于HeroInfo模型类,有两种注册方式

      • 方式一:与BookInfo模型类相同
      • 方式二:关联注册
    • 按照BookInfor的注册方式完成HeroInfo的注册

    • 接下来实现关联注册
    复制代码
    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)
    复制代码
    • 可以将内嵌的方式改为表格
    class HeroInfoInline(admin.TabularInline)

      添加一个图书信息的同时会添加3个英雄信息

     

     admin注册

    15 视图

    • 在django中,视图对WEB请求进行回应
    • 视图接收reqeust对象作为第一个参数,包含了请求的信息
    • 视图就是一个Python函数,被定义在views.py中
    复制代码
    #coding:utf-8
    from django.http import HttpResponse
    
    def index(request):
        return HttpResponse("index")
    def detail(request,id):
        return HttpResponse("detail %s" % id)
    复制代码
    • 定义完成视图后,需要配置urlconf,否则无法处理请求

     View层

    16 URLconf

    • 在Django中,定义URLconf包括正则表达式、视图两部分
    • Django使用正则表达式匹配请求的URL,一旦匹配成功,则调用应用的视图
    • 注意:只匹配路径部分,即除去域名、参数后的字符串
    • 在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),
    ]

     

     

     url。conf
     url

    17 模板

    • 模板是html页面,可以根据视图中传递的数据填充值
    • 创建模板的目录如下图:

        

    • 修改settings.py文件,设置TEMPLATES的DIRS值
    'DIRS': [os.path.join(BASE_DIR, 'templates')],
    • 在模板中访问视图传递的数据
    {{输出值,可以是变量,也可以是对象.属性}}
    {%执行代码段%}

      一个app对应一个文件夹

       

    复制代码
    #coding=utf-8
    from django.shortcuts import render
    from django.http import request,response,HttpResponse
    
    from django.template import RequestContext,loader
    
    # Create your views here.
    
    def index(request):
         temp = loader.get_template('booktest/index.html')  # 加载这个模板
         return HttpResponse(temp.render())
    复制代码

     

    复制代码
    #coding=utf-8
    from django.shortcuts import render
    from django.http import request,response,HttpResponse
    
    # Create your views here.
    
    def index(request):
        context = {}
        return render(request,'booktest/index.html',context)
    复制代码

     

     

     18.详细信息

    去除模板的硬编码

    • 在index.html模板中,超链接是硬编码的,此时的请求地址为“127.0.0.1/1/”
    <a href="{{book.id}}">
    • 看如下情况:将urlconf中详细页改为如下,链接就找不到了
    url(r'^book/([0-9]+)/$', views.detail),
    • 此时的请求地址应该为“127.0.0.1/book/1/”
    • 问题总结:如果在模板中地址硬编码,将来urlconf修改后,地址将失效
    • 解决:使用命名的url设置超链接
    • 修改test1/urls.py文件,在include中设置namespace
    url(r'^admin/', include(admin.site.urls, namespace='booktest')),
    • 修改booktest/urls.py文件,设置name
    url(r'^book/([0-9]+)/$', views.detail, name="detail"),
    • 修改index.html模板中的链接
    <a href="{%url 'booktest:detail' book.id%}">

     

    19.开发流程

     

      

  • 相关阅读:
    CQUOJ 10819 MUH and House of Cards
    CQUOJ 9920 Ladder
    CQUOJ 9906 Little Girl and Maximum XOR
    CQUOJ 10672 Kolya and Tandem Repeat
    CQUOJ 9711 Primes on Interval
    指针试水
    Another test
    Test
    二分图匹配的重要概念以及匈牙利算法
    二分图最大匹配
  • 原文地址:https://www.cnblogs.com/Bighua123/p/8317299.html
Copyright © 2011-2022 走看看