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语句
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
       

原文地址:https://www.cnblogs.com/aaron-shen/p/5841949.html