• day18-Django入门


    1、路由系统(路由匹配,找对应的可以处理的url)

        project:
            django-admin startproject mysite
            cd mysite
            python manage.py startapp app01
            
        普通关系:

      请求先到url,执行for循环,匹配到就到对应函数进行处理,否则就404
            /index/ -> 函数
            /login/ -> 函数
            ...
            # 反射:
                /(w+)/(w+)
                /home/index
                => 导入:home模块,getattr(index)  fun()
                
            
            
        动态关系:
            /index/(w+)  -> 函数(参数)

        几个(w+) 几个参数

      url(r'^detail3/(?P<p1>d+)/(?P<x2>d+)/', views.detail3), >指定参数名的,第一个参数是p1 第二个参数时x2  根据名字进行传值。
            
        路由分发:

        from django.conf.urls import url, include引入新模块

        
        urlpatterns = [
          url(r'^web/', include('app01.urls')),
        ]

        作为第一级别的映射

        在app01中 新建一个urls.py ,做进一步的映射

    from django.conf.urls import url
    from django.contrib import admin
    # 路由系统
    from app01 import views

    urlpatterns = [
    # url(r'^index/(d+)/', views.index),
    # url(r'^detail/(d+)/', views.detail),
    # url(r'^template', views.template),
    url(r'^assets', views.assets),
    url(r'^userinfo', views.userinfo),
    url(r'^ajax_demo', views.ajax_demo),
    ]
       /index/  ->   app.url文件[ /index/(w+)  -> 函数(参数) ,]

       动态路由系统demo:http://www.cnblogs.com/wupeiqi/articles/5237704.html

    ###################################################

      小练习:

    from django.conf.urls import url
    from django.contrib import admin
    # 路由系统
    from app01 import views
    # from namaer import views
    from django.conf.urls import url, include
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        # url(r'^index/', views.f1),
        # url(r'^login/', views.login),
        # url(r'^detail/(d+)/', views.detail),
        # url(r'^detail2/(d+)/(d+)/', views.detail2),
        # url(r'^detail3/(?P<p1>d+)/(?P<x2>d+)/', views.detail3),
        # url(r'^index/(d+)/', views.index),
        # url(r'^detail/(d+)/', views.detail),
        url(r'^web/', include('app01.urls')),
    ]
    urls(主)
    from django.conf.urls import url
    from django.contrib import admin
    # 路由系统
    from app01 import views
    
    urlpatterns = [
        # url(r'^index/(d+)/', views.index),
        # url(r'^detail/(d+)/', views.detail),
        # url(r'^template', views.template),
        url(r'^assets', views.assets),
        url(r'^userinfo', views.userinfo),
        url(r'^ajax_demo', views.ajax_demo),
    ]
    urls(分)
    from django.shortcuts import HttpResponse
    
    def f1(request):
        return HttpResponse('OK')
    
    def login(request):
        return HttpResponse('OK')
    
    def detail(request, nid):
        print(nid)
        return HttpResponse('OK')
    # detail2(1,2)
    def detail2(request, xid, nnid):
        print(xid,nnid)
        return HttpResponse('OK')
    
    # detail3(x2=234,p1=123)
    def detail3(request, p1, x2):
        print(p1,x2)
        return HttpResponse('OK')
    Views
    from django.shortcuts import render
    USER_LIST = []
    for item in range(94):
        temp = {"id": item, 'username':'alex'+str(item), 'email': 'email' + str(item)}
        USER_LIST.append(temp)
    
    def index(request, page):
        print(page)
        # 1,0-9
        # 2,10-19
        # 3,20-29
        page = int(page)
        start = (page - 1) * 10
        end = page * 10
        user_list = USER_LIST[start:end]
        # return HttpResponse('OK')
        return render(request, 'index.html', {'user_list': user_list})
    views(分页)
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
        <table>
            <tr>
                <td>ID</td>
                <td>用户名</td>
                <td>详细</td>
            </tr>
            {% for item in user_list %}
                <tr>
                    <td>{{ item.id }}</td>
                    <td>{{ item.username }}</td>
                    <td><a href="/web/detail/{{ item.id }}/">查看详细</a></td>
                </tr>
            {% endfor %}
        </table>
    </body>
    </html>
    index(分页)
    def detail(request, nid):
        nid = int(nid)
        current_detail_dict = USER_LIST[nid]
        # current_detail_dict?
        return render(request, 'detail.html', {'current_detail_dict': current_detail_dict})
    Views(增加详细信息)

     
    2、模版

        a. 模版渲染的过程
        
        b. {{ k1 }} --> 索引是. 模板语言不支持索引取值

        {{ k2.0 }}这样取第一个值

        {{ k3.name }}字典取值方法
        
        c.  {% for item in k2 %}
                <p>

          {{ item }},

          {{ forloop.counter }}, 从1开始索引

          {{ forloop.counter0 }},从0开始索引

          {{ forloop.first }},是否是第一个值

          {{ forloop.last }},是否是最后一个值

          {{ forloop.revcounter }} 倒序

        </p>
            {% endfor %}

    if elif else :

       {% if k1 == 'v1' %}

        <h1>123<h1/>

      {% elif k1 == 'v2' %}

        <h1>333<h1/>

      {% else %}

        <h1>777<h1/>

      {% endif %}

      {{ name|lower }} 取的值变成小写

        d. 模版语言的内置方法
        
        e. 自定义方法
            filter
            simple_tag
            
            1、创建指定文件,名称不能改 templatetags
            2、创建任意 .py 文件,如:xx.py
                
                from django import template
                from django.utils.safestring import mark_safe
                from django.template.base import resolve_variable, Node, TemplateSyntaxError
                # 必须不变
                register = template.Library()
                
                # 创建函数
                @register.filter
                def f1(value):
                    return value + "666"
            3、在html模版的头部执行
            
                {% load xx %}
            
            4、
                k1 = 'VVV'
                {{k1}}    => vvv
                {{k1|f1}} => vvv666
            
            5、 settings.py 中注册app
            
            总结:
                filter
                    限制:传参 (只能写2个参数)
                    支持:模版语言的 if 条件
                simple_tag
                    不支持:模版语言的 if 条件
        

    # Author:Alex Li
    from django import template
    from django.utils.safestring import mark_safe
    from django.template.base import resolve_variable, Node, TemplateSyntaxError
    
    register = template.Library()
    
    @register.filter
    def f1(value, arg):
        return value + "666" + arg
    
    @register.simple_tag
    def f2(s1,s2,s3, s4):
        return s1 + s2 + s3 + s4
    
    @register.filter
    def f3(value):
        if value == 'VVV':
            return True
        return False
    
    @register.simple_tag
    def f4(value):
        if value == 'VVV':
            return True
        return False
    xx(模板语言使用函数调用)


        f. 模版的继承
            母板:
                    
                    balabala...
                    
                    {% block 名称 %} {% endblock %}
                    
                    balabala...
                    
            
            子板:
                    {% extends '母板html文件名' %}
                    
                    
                    {% block 名称 %}
                    
                        具体子页面的内容...
                        
                    {% endblock %}


        
        g. include(可以重复使用)
        
            小组件: x.html
            
            {% include 'x.html' %}
        
    3、Ajax
        a. 下载
        b. 放置在static目录下
        c. setting配置
        c. html导入
        
        $.ajax({
            url: '/index/',
            type: 'POST',
            data: {'username': 'alex','password': '123'},
            success: function(data){
                // 当后台return之后,该函数自动执行
                // data就是后台返回的数据
            }
        })
        
        
        Ajax:
            1、XMLHttpRequest对象(原生Ajax)
            2、jQuery - XMLHttpRequest对象(jQuery ajax)
            3、跨域Ajax
                浏览器同源策略:
                    Ajax,只能给自己的域名发请求
                    跨域名,浏览器做拦截

          解决浏览器同源策略:

          jsonp

          跨域资源共享
                
                
    四、model,ORM
        
        1、创建(CURD)数据库表

      ORM分2类
            class -> DB,表
            DB,表 -> 类
            
            a. app.models.py写类
                from django.db import models
     
                class userinfo(models.Model):(一共4列,默认会有一个自增列)
                    name = models.CharField(max_length=30) # string
                    email = models.EmailField()            # string,帮助admin做输入验证,modelform
                    memo = models.TextField()              # text
            
            
            b. python manage.py makemigrations
               python manage.py migrate
        
               python manage.py createsuperuser
               
        
        2、操作数据库的数据
            类
            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
                input:  12,345,989871234,
            
              继承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 文件   字符串



        a. 单表
        b. 一对多:Forigkey
        c. 多对多
        d. 一对一
        
            
        obj = model.UserInfo.objects.filter(name='alex')
        print obj.query
        
        queryset -> python,Django的类
        [obj1,obj2,obj3]
        
        obj = model.UserInfo.objects.filter(name='alex').values('id','email')
        # select id from userinfo where name = 'alex'
        
        queryset -> python,Django的类
        [{'id':1},{'id': 2},]
        
        obj = model.UserInfo.objects.filter(name='alex').value_list('id','email')
        # select id from userinfo where name = 'alex'
        
        queryset -> python,Django的类
        [(1,'1@qq.com'),(2,'alex@11.com'),]
            
            
        queryset.query => SQL语句
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
           

  • 相关阅读:
    阅读<SQL语言艺术>实践五
    <SQL语言艺术>阅读计划
    文本类文件与VS关联实践
    接口开发原则
    逻辑部分开发原则
    <海量数据库解决方案>2011022301
    5800对于存储卡密码设置问题
    [转]Delphi用户登录窗口框架
    20世纪科学界最重要的12本书
    [转]UDP/TCP穿越NAT的P2P通信方法研究(UDP/TCP打洞 Hole Punching)
  • 原文地址:https://www.cnblogs.com/aaron-shen/p/5841949.html
Copyright © 2020-2023  润新知