Dayday up ---- python Day19

 回顾django基础

  django 请求生命周期

    ---> url对应关系(匹配) ---> 视图 函数 ---> 返回用户字符串

    ---> url对应关系(匹配) ---> 视图 函数 ---> 打开一个html文件

  创建 django project

    django-admin startproject mysite

    cd mysite

    python manage.py startapp cmdb  创建app

  配置

    模板路径

    静态文件路径

    注释全站伪造  # csrf

  编写程序

    a、 url.py

      ^index/    ----> func

    b、 views.py

      def func(request):

        # 包含所有的请求数据

        ....

        return HttpResponse('字符串')

        return render(request,'index.html',{''})

        return redirect('URL')

    c、 模板语言

      return render(request, ‘index.html’, {‘li’: [11,22,33]})

      {% for item in li %}

        <h1>{{item}}</h1>

      {%endfor%}

      ****索引用点.****

      <h2>{{item.0}}</h2>

Django 

后台获取数据

  单个数据: request.POST.get   比如:input (text,radio,password)

  多个数据: request.POST.getlist   比如: input(checkbox)

  上传文件: request.POST.get  只能获取文件名

       request.FILES.get 获取文件

       

FBV & CBV

  FBV:  function base view

  CBV:  class base view

     基于反射查找

     请求 ---> dispatch ---> get/post ---> dispatch ---> 用户

  CBV 实例:

    

    

    

模板语言:

  字典:

urls.py     

from django.views import View
class Detail(View):
    def get(self,request):
        USER_LIST = {
            'k1': 'root1',
            'k2': 'root2',
            'k3': 'root3',
            'k4': 'root4',
        }
        print(request.method)
        return render(request, 'detail.html', {'USER_LIST': USER_LIST})
views.py
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <div>
        {{ USER_LIST.k1 }}
        <ul>
            {% for k in USER_LIST.keys %}
                <li>{{ k }}</li>
            {% endfor %}
        </ul>
        <ul>
            {% for v in USER_LIST.values %}
                <li>{{ v }}</li>
            {% endfor %}
        </ul>
        <ul>
            {% for k,v in USER_LIST.items %}
                <li>{{ k }}-{{ v }}</li>
            {% endfor %}
        </ul>
    </div>
</body>
</html>
detail.html 

路由系统

   1、单一路由对应:

    url(r'^index$',view.index)

    url:/index

  2、基于正则的路由

    url(r'^index/(\d*)',view,.index)

    url: /index/123

    函数得添加参数  

    

  实例:

  

USER_LIST = {
    'k1': 'root1',
    'k2': 'root2',
    'k3': 'root3',
    'k4': 'root4',
}
class user_info(View):
    def get(self,request):
        return render(request,'user_info.html',{'USER_LIST' : USER_LIST})
class Detail(View):
    def get(self,request,uid,nid):
    # def get(self, request, uid, nid):
        detail_info = USER_LIST[uid]
        print(request.method)
        return render(request, 'detail.html', {'detail_info': detail_info})
views.py
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <div>
        {% for k,v in USER_LIST.items %}
            <p><a href="detail-{{ k }}-{{ v }}.html">{{ k }}</a></p>
        {% endfor %}
    </div>
</body>
</html>
user_info.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <div>
        <ul>
            <li>{{ detail_info }}</li>
        </ul>
    </div>
</body>
</html>
detail.html

 总结:

  url 路由正则

  1、url(r'^index/', views.index),       url(r'^home/',views.Home.as_view()),

  2、url(r'^detail-(\d+).html', views.detail),

  3、url(r'^detail-(?P<nid>\d+)-(?P<uid>\d+).html', views.detail)

  函数参数可以使用 *args **kwargs

  如: 

  

  

  3、为路由映射设置名称 

    name: 对url路由的关系进行命名 以后可以根据此名称生成自己想要的url   

 

    随意填的数据分别对应url里面的参数

    设置名称之后,可以在不同的地方调用,如:

    •   模板中使用生成URL     {% url 'h2' 2012 %}
    •   函数中使用生成URL     reverse('h2', args=(2012,))      路径:django.urls.reverse
    •   Model中使用获取URL  自定义get_absolute_url() 方法

    获取请求匹配成功的URL信息:request.resolver_match

  4、urls分发

    一级路由: 

      from django.conf.urls import url,include

      url(r'^hosts_info', include("hosts_info.urls")),

    二级路由:      

      from django.conf.urls import url,include

      from django.contrib import admin

      from hosts_info import views 

      urlpatterns = [

           url(r'^login/',views.login)

       ]

 

Django orm数据库操作 

  程序数据库操作分为两种:

    db_first  直接在数据库里操作

    code_first 先创建代码 执行之后创建操作 *** 推荐 

 

  ORM

    1、根据类自动创建数据库表

      # app下的 models.py

    2、根据类对数据库表中的数据进行各种操作

   django默认数据库是db.sqlite3 如果想支持mysql 默认使用MySQLdb模块,而python3还没有,现在可以使用pymysql

   配置:

   settings.py  

  DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'dbname',
'USER': 'usernmae',
'PASSWORD': 'pwd',
'HOST': 'ip',
'PORT': 'port',
  }
 }
  # 如下设置放置的与project同名的配置的 __init__.py文件中

   import pymysql

   pymysql.install_as_MySQLdb() 

  使用四部曲:

    1、在app 下的models.py 写类,即表结构

      默认的数据库生成表名称为: app名称_类名

      如果想自定义表名: 

      在Userinfo中,加上函数 Meta

      db_table = "table_name"

      

    2、注册app,在settings.py 中 INSTALLED_APPS 添加app名字

      

    3、在console 执行 python manage.py makemigrations

    4、在console 执行 python manage.py migrate

   创建表数据

    

  查询表数据

    

  删除表数据

    

  修改表数据

    

   判断数据库是否存在某数据

    

  orm 创建表自动添加id列,并且自增, 如果想自己设置是否自增

    id = models.AutoField(primary_key=True)  

  字段:  

1、models.AutoField  自增列 = int(11)
  如果没有的话,默认会生成一个名称为 id 的列,如果要显示的自定义一个自增列,必须将给列设置为主键 primary_key=True。
2、models.CharField  字符串字段
  必须 max_length 参数
3、models.BooleanField  布尔类型=tinyint(1)
  不能为空,Blank=True
4、models.ComaSeparatedIntegerField  用逗号分割的数字=varchar
  继承CharField,所以必须 max_lenght 参数
5、models.DateField  日期类型 date
  对于参数,auto_now = True 则每次更新都会更新这个时间;auto_now_add 则只是第一次创建添加,之后的更新不再改变。
6、models.DateTimeField  日期类型 datetime
  同DateField的参数
7、models.Decimal  十进制小数类型 = decimal
  必须指定整数位max_digits和小数位decimal_places
8、models.EmailField  字符串类型(正则表达式邮箱) =varchar
  对字符串进行正则表达式
9、models.FloatField  浮点类型 = double
10、models.IntegerField  整形
11、models.BigIntegerField  长整形
  integer_field_ranges = {
    'SmallIntegerField': (-32768, 32767),
    'IntegerField': (-2147483648, 2147483647),
    'BigIntegerField': (-9223372036854775808, 9223372036854775807),
    'PositiveSmallIntegerField': (0, 32767),
    'PositiveIntegerField': (0, 2147483647),
  }
12、models.IPAddressField  字符串类型(ip4正则表达式)
13、models.GenericIPAddressField  字符串类型(ip4和ip6是可选的)
  参数protocol可以是:both、ipv4、ipv6
  验证时,会根据设置报错
14、models.NullBooleanField  允许为空的布尔类型
15、models.PositiveIntegerFiel  正Integer
16、models.PositiveSmallIntegerField  正smallInteger
17、models.SlugField  减号、下划线、字母、数字
18、models.SmallIntegerField  数字
  数据库中的字段有:tinyint、smallint、int、bigint
19、models.TextField  字符串=longtext
20、models.TimeField  时间 HH:MM[:ss[.uuuuuu]]
21、models.URLField  字符串,地址正则表达式
22、models.BinaryField  二进制
23、models.ImageField   图片
24、models.FilePathField 文件
字段

  字段参数: 

null               -> db是否可以为空
            default            -> 默认值
            primary_key        -> 主键
            db_column          -> 列名
            db_index           -> 索引
            unique               -> 唯一索引
            unique_for_date    -> 
            unique_for_month
            unique_for_year
            auto_now           -> 创建时,自动生成时间
            auto_now_add       -> 更新时,自动更新为当前时间
            
                # obj = UserGroup.objects.filter(id=1).update(caption='CEO')
                # obj = UserGroup.objects.filter(id=1).first()
                # obj.caption = "CEO"
                # obj.save()
                
            choices              -> django admin中显示下拉框,避免连表查询
            blank             -> django admin是否可以为空
            verbose_name      -> django admin显示字段中文
            editable          -> django admin是否可以被编辑
            error_messages    -> 错误信息欠
            help_text         -> django admin提示
            validators          -> django form ,自定义错误信息
字段参数

  创建外键:

    user_group = models.ForeingnKey("UserGroup",to_field='uid',default=1)

  创建外键数据:

    models.UserInfo.objects.create(

      username='root1',

      password='123',

      email='aaaa@163.com',

      user_group_id = 1

      # 或者 user_group = models.UserGroup.objects.filter(id=1).first()

      user_group 是一个对象

    )

  一对多:

    当一张表中创建一行数据时,有一个单选的下拉框(可以被重复选择)

 

posted @ 2016-12-14 15:17  a_monologue  阅读(65)  评论(0)    收藏  举报