前端知识——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{
            width: 20%;
            float: left;
        }
        .pg-body .body-content{
            width: 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语句

posted @ 2016-09-07 18:21  wzc1206  阅读(191)  评论(0编辑  收藏  举报