• 前端知识——Django


    一、路由系统

       路由系统就是通过Django来实现的类似nginx rewrite的功能,并且支持正则表达式的结构

     普通关系是

    /index/ -> 函数

    动态关系:

    在django里面urls.py里面
    
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        # url(r'^login/', views.login),
        # url(r'^detail1/(d+)/', views.detail1),
        # url(r'^detail2/(d+)/(d+)/', views.detail2),
        # url(r'^detail3/(?P<p1>d+)/(?P<x1>d+)/', views.detail3),
    ]
    

     上面的三条detail就是通过正则来实现的,下面是对应的程序

    # def detail1(render,nid):
    #     print(nid)
    #     return HttpResponse("ok")
    #
    # def detail2(render,nid,nnid):
    #     print(nid,nnid)
    #     return HttpResponse("ok")
    #
    # def detail3(render,p1,x1):
    #     print(p1,x1)
    #     return HttpResponse("ok")
    

    现在来说一下路由分发

     这个是实现的程序内部 

    view.py
    
    USER_INFO=[]
    for item in range(98):
        temp={'id':item,'username':'wzc'+str(item),'email':'email'+str(item)}
        USER_INFO.append(temp)
    
    def index(request,page):
        print(page)
        page=int(page)
        start_page=(page-1)*10
        end_page=page*10
        user_list=USER_INFO[start_page:end_page]
        return render(request,'index.html',{'user_list':user_list})
    
    def detail(request,nid):
        nid=int(nid)
        cdd=USER_INFO[nid]
        return render(request,'detail.html',{'cdd':cdd})
    

     我们使用的时候,只用到了index和detail,所以路由规则的时候只需要写这两条,#自己去掉就好了

    urls.py
        # url(r'^index/(d+)', views.index),
        # url(r'^detail/(d+)', views.detail),
    

     这个是index对应的页面

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <table>
            <thead>
                <th>ID</th>
                <th>用户名</th>
                <th>邮箱</th>
            </thead>
            <tbody>
                {% for foo in user_list %}
                    <tr>
                        <td>{{ foo.id }}</td>
                        <td>{{ foo.username }}</td>
                        <td>{{ foo.email }}</td>
                        <td><a href="/detail/{{ foo.id }}">详细信息</a></td>
                    </tr>
                {% endfor %}
                
            </tbody>
        </table>
    </body>
    </html>
    

     这个是detail对应的页面

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <ul>
            <li>
                    {{ cdd.id }}
            </li>
            <li>
                    {{ cdd.username }}
            </li>
            <li>
                    {{ cdd.email }}
            </li>
        </ul>
    </body>
    </html>
    

    模板语言

      

        {% for item in user_list %}
            <li>XXXXX</li>
        {% endfor %}
    
        {% if k1|f3 %}
            <h1>XXX</h1>
        {% else %}
            <h1>XXX</h1>
        {% endif %}
    

     内置方法:

    {{ item.event_start|data:"Y-m-d H:i:s"}}
    {{ bio|truncatewords:"30"}}只显示30个字符
    {{ my_list|first|upper}}首字母大写
    {{ name|lower}}全部小写
    

    自定义方法:

      filter

      simple_tag

      1、创建指定文件,并且文件的名称不能改,必须使用templatetags

        在app里面创建目录

      2、创建任意名字的py文件

        

    from django import template
    
    register=template.Library()#返回值的名称必须叫做register,这个是不可以修改的
    
    @register.filter
    def f1(value,arg):
        return value+'666'+arg
    
    

     @register.filter ,在定义函数的时候,使用这个了以后,就变成模板语言里面的函数,这个就是创建对应的函数

    3、在html模板头部必须要执行

    {% load XX %}
    

     这样就相当于是导入脚本

    4、如何使用

      {{ k1|f1}},前面是对应的k值,后面是对应的函数值,返回的结果就是把k1对应的value值传到函数里面后得到的数据

    5、需要在settings里面注册对应的子项目名称

    传参数的使用方法是:

      {{ k1|f1:"123"}}

    需要注意的是filter和sample_tag是有区别的

    filter:对应的参数只能有一个,使用方法如上,支持在if里面当做条件,因为使用管道符

    sample_tag:参数可以有多个,使用方法{% f2 1 2 3%},不支持在if的条件中使用

    {% load xx %}
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        {% if k1|f3 %}
            <h1>Ture</h1>
        {% else %}
            <h1>False</h1>
        {% endif %}
    </body>
    </html>
    
    from django import template
    
    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
    

    模板的使用实例:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title></title>
        <link rel="stylesheet" href="..." />
        <style>
            .pg-header{
                height: 48px;
                background-color: cadetblue;
            }
            .pg-body{
                min-height: 500px;
            }
            .pg-body .body-menu{
                 20%;
                float: left;
            }
            .pg-body .body-content{
                 80%;
                float: left;
            }
            .pg-footer{
                height: 100px;
                background-color: brown;
            }
            .active{
                background-color: aquamarine;
                color: white;
            }
        </style>
    
        {% block css %}{% endblock %}
    </head>
    <body>
        <div class="pg-header">
            后台系统V1
        </div>
        <div class="pg-body">
            <div class="body-menu">
                <ul>
                    <li><a href="/web/userinfo">用户管理</a></li>
                    <li><a href="/web/assets">资产管理</a></li>
                </ul>
            </div>
            <div class="body-content">
                {% block body %}{% endblock %}
            </div>
    
        </div>
        <div class="pg-footer"></div>
        <script src="xxx"></script>
        {% block js %}{% endblock %}
    </body>
    </html>
    
    {% extends 'layout.html' %}
    
    {% block css %}
        <style></style>
    {% endblock %}
    
    {% block body %}
        <ul>
        {% for item in user_list %}
            <li>{{ item.username }},{{ item.salary }}</li>
        {% endfor %}
        </ul>
    
    {% endblock %}
    
    {% block js %}
    
    {% endblock %}
    

     这样相同的模板就可以使用不一样的js和css了

    Ajax

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <div>
            <p>用户名<input type="text" id="username"/></p>
        </div>
        <div>
            <p>密码<input type="password" id="pwd"/></p>
        </div>
        <input type="button" value="提交" onclick="SubmitForm();"/>
    
    <script src="/static/jquery-1.12.4.js"></script>
    
    <script>
        function SubmitForm() {
            $.ajax(
                    {
                        url:'/web/ajax_demo/',
                        type:'POST',
                        data:{'user':$('#username').val(),'pwd':$('#pwd').val()},
                        dataType:'json',
                        success:function (data) {
                            console.log(data)
                            if (data.status){
                                location.href="https://www.baidu.com"
                            }else {
                                alert(data.message)
                            }
    {#                        if(data == '1' ){#}
    {#                            location.href="https://www.baidu.com"#}
    {#                        }else {#}
    {#                            alert("用户名密码错误")#}
    {#                        }#}
                        }
                    }
            )
        }
    </script>
    
    </body>
    </html>
    
    # def ajax_demo(request):
    #     if request.method == "POST" :
    #         user=request.POST.get('user',None)
    #         pwd=request.POST.get('pwd',None)
    #         if user == "111" and pwd == "222":
    #             return HttpResponse('1')
    #         else:
    #             return HttpResponse('2')
    #     return render(request,'ajax_demo.html')
    import json
    def ajax_demo(request):
        if request.method == "POST" :
            ret={'status':False,'message':""}
            user=request.POST.get('user',None)
            pwd=request.POST.get('pwd',None)
            if user == "111" and pwd == "222":
                ret['status']=True
                return HttpResponse(json.dumps(ret))
            else:
                ret['message']="用户名密码错误"
                return HttpResponse(json.dumps(ret))
        return render(request,'ajax_demo.html')
    

    model,ORM


    1、创建(CURD)数据库表
    class -> DB,表
    DB,表 -> 类

    a. app.models.py写类
    from django.db import models

    class userinfo(models.Model):
    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

    from django.db import models
    
    # Create your models here.
    
    class userinfo(models.Model):
        nid=models.AutoField(primary_key=True)
        name=models.CharField(max_length=30)
        email=models.EmailField()
        memo=models.TextField()
        img=models.ImageField()
        user_type=models.ForeignKey('user_type',null=True,blank=True)
    
    class user_type(models.Model):
        name=models.CharField(max_length=32)
    
        def __str__(self):
            return self.name
    


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

  • 相关阅读:
    要学习TINY框架要有什么前提条件?
    如何获取最新的代码?
    python 反射的用法
    面试题1
    Process多进程的创建方法
    异常捕捉
    用type动态创建Form
    ModelForm的使用
    git 常见命令
    TVTK库的安装
  • 原文地址:https://www.cnblogs.com/wlzhc/p/5850453.html
Copyright © 2020-2023  润新知