一、路由系统

1.创建Django项目

django-admin startproject day18
cd day18
python3 manage.py startapp app01

2.app01/urls.py配置

from django.conf.urls import url
from django.contrib import admin
from app01 import views urlpatterns = [
#url(r'^admin/', admin.site.urls),
# 传参方式
url(r'^detail/(\d+)/', views.detail),
url(r'^detail2/(\d+)/(\d+)/', views.detail2),
url(r'^detail3/(?P<p1>\d+)/(?P<x2>\d+)/', views.detail3),
]

路由关系:

普通关系:
/index/ -->函数
动态关系:
/index/(\w+)\/ -->函数(参数)
路由分发:
/index/ ->app.url文件 [ /index/(\w+)\/ -->函数(参数)]

app01/views.py

from django.shortcuts import render
from django.shortcuts import HttpResponse # Create your views here. 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)
page = int(page)
start = (page - 1) * 10
end = page * 10
user_list = USER_LIST[start:end]
return render(request, 'index.html',{'user_list':user_list}) def detail(request, nid):
nid = int(nid)
current_detail_dict = USER_LIST[nid]
return render(request, 'detail.html',{'current_detail_dict':current_detail_dict})

访问地址:

http://127.0.0.1:8000/detail/11
http://127.0.0.1:8000/detail2/11/22
http://127.0.0.1:8000/detail3/11/22

templates/detail.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>详细信息</title>
</head>
<body>
<ul>
<li>
{{ current_detail_dict.id }}
</li>
<li>
{{ current_detail_dict.username }}
</li>
<li>
{{ current_detail_dict.email }}
</li>
</ul>
</body>
</html>

3.创建manager APP

python3 manage.py startapp manager

4.配置day18/urls.py

from django.conf.urls import url
from django.contrib import admin
from django.conf.urls import url, include
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^web/', include('app01.urls')),
]

5.templates/index.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>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>

访问地址:

http://127.0.0.1:8000/web/index

二、模板语言

模板渲染:
a.模板渲染的过程
b.{{ k1 }} -->索引
c. {% for item in k2 %}
<p>{{ item }},{{ forloop.counter }},{{ forloop.counter0 }},{{ forloop.first }},{{ forloop.last }}</p>
{% endfor %}
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 render_value_in_context, Node, TemplateSyntaxError
#必须不能变
register = template.Library() #创建函数
@register.filter
def f1(value):
return value + 10 3、在HTML模板的头部执行
{% load xx %}
4、使用
k1 = 'v1'
{{ k1 }} -->v1
{{ k1|f1 }} -->v1666
5、settings.py注册
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'app01',
]
filter
限制:传参
支持:模板语言里中if条件
simple_tag
不支持:模板语言中的if条件 f.模板(母版)的继承

1.app01/urls.py

from django.conf.urls import url
from django.contrib import admin
from app01 import views
urlpatterns = [
url(r'^template/', views.template),
]

2.app01/views.py

from django.shortcuts import render
from django.shortcuts import HttpResponse def template(request):
return render(request,'template.html',
{'k1':'v1','k2':[11,22,33],'k3':{'username':'alex','email':'email1',}})

3.templates/template.html

{% load xx %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{{ k1 }}
{{ k2.0 }}
{{ k3.username }} {% for item in k2 %}
<p>{{ item }},{{ forloop.counter }},{{ forloop.counter0 }},{{ forloop.first }},{{ forloop.last }}</p>
{% endfor %} {% if k1 == 'v1' %}
<h1>V1</h1>
{% elif k1 == 'v2' %}
<h1>V2</h1>
{% else %}
<h1>other</h1>
{% endif %}
{# filter传多个参数#}
{{ k1|f1:'wang,1234' }}
{# simple_tag传多个参数#}
{% f2 1 2 3 4 5 6 7 8 %} {% if k1|f3 %}
<h1>True</h1>
{% else %}
<h2>False</h2>
{% endif %}
</body>
</html>

4.templates/layout.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>用户管理</title>
<link rel="stylesheet" href="..." />
<style>
.pg_header{
height: 48px;
background-color: brown;
}
.pg_body .body_menu{
width: 20%;
float: left;
}
.pg_body .body_content{
width: 80%;
float: left;
}
.pg_body{
min-height: 600px;
}
.pg_footer{
height: 200px;
background-color: blue;
}
.active{
background-color: darkcyan;
}
</style>
{% block css %}{% endblock %}
</head>
<body>
<div class="pg_header">
后台系统
</div>
<div class="pg_body">
<div class="body_menu">
<ul>
<li><a id="userinfo" href="/web/userinfo" >用户管理</a></li>
<li><a id="assets" 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>

templates/userinfo.html

{% extends 'layout.html' %}
{% block body %}
<ul>
{% for item in user_list %}
<li>{{ item.username }},{{ item.salary }}</li>
{% endfor %}
</ul>
{% endblock %} {% block js %}
<script>
document.getElementById('userinfo').className = 'active';
</script>
{% endblock %}

templates/assets.html

{% extends 'layout.html' %}

{% block css %}
{% endblock %} {% block body %}
<table>
{% for item in assets_list %}
<tr>
<td>{{ item.hostname }},{{ item.port }}</td>
</tr>
{% endfor %}
</table>
{# 小组件导入#}
{% include 'child.html' %}
{% include 'child.html' %}
{% include 'child.html' %}
{% endblock %}s {% block js %}
<script>
document.getElementById('assets').className = 'active';
</script>
{% endblock %}

templates/child.html

<form>
<input />
<input />
<input />
<input />
<input />
</form>

5.创建app01/templatetags/xx.py

#!/usr/bin/env python
# coding:utf-8 from django import template
from django.utils.safestring import mark_safe
from django.template.base import render_value_in_context, Node, TemplateSyntaxError import re
register = template.Library() @register.filter
def f1(value, args):
aa = re.split(',', args)
return value + '' + aa[0] + aa[1] @register.simple_tag
def f2(s1, s2, s3, s4, s5, s6, s7, s8):
return s1+s2+s3+s4+s5+s6+s7+s8 @register.filter
def f3(value):
if value == 'v1':
return True
else:
return False

三、Ajax

Ajax
a.存放在static下
b.settings.py中导入
c.HTML导入 $.ajax({
url: '/index',
type: 'POST',
data: {'username': 'wang', 'password': ''},
success: function(data){
//当后台return之后,该函数自动运行
//data就是后台返回的数据
}
}) 注意:
1、浏览器中XMLHttpRequest对象(原生的Ajax)
2、jQuery调用XMLHttpRequest对象(jQuery ajax)
3、跨域Ajax
浏览器同源策略:
Ajax只能给自己的域名发请求
跨域名,浏览器做拦截(jsonp、跨域资源共享-header)

1.day18/settings.py

STATIC_URL = '/static/'
STATICFILES_DIRS = (
os.path.join(BASE_DIR, 'static'),
)

2.app01/urls.py

from django.conf.urls import url
from django.contrib import admin
from app01 import views
urlpatterns = [
#url(r'^admin/', admin.site.urls),
# 传参方式
# 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'^template/', views.template),
#url(r'^extend/', views.extend),
url(r'^assets/', views.assets),
url(r'^userinfo/', views.userinfo),
url(r'^ajax_demo/', views.ajax_demo),
]

3.app01/views.py

from django.shortcuts import render
from django.shortcuts import HttpResponse
import json # Create your views here. 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)
page = int(page)
start = (page - 1) * 10
end = page * 10
user_list = USER_LIST[start:end]
return render(request, 'index.html',{'user_list':user_list}) def detail(request, nid):
nid = int(nid)
current_detail_dict = USER_LIST[nid]
return render(request, 'detail.html',{'current_detail_dict':current_detail_dict}) def template(request):
return render(request,'template.html',
{'k1':'v1','k2':[11,22,33],'k3':{'username':'alex','email':'email1',}}) # def extend(request):
# return render(request, 'extend.html') def assets(request):
assets_list = []
for i in range(10):
temp = {'hostname':'h1'+str(i),'port':80}
assets_list.append(temp)
return render(request, 'assets.html',{'assets_list':assets_list}) def userinfo(request):
user_list = []
for i in range(10):
temp = {'username': 'wang' + str(i), 'salary': 8000}
user_list.append(temp)
return render(request, 'userinfo.html',{'user_list':user_list}) 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 == '' and pwd == '':
ret['status'] = True
return HttpResponse(json.dumps(ret))
else:
ret['message'] = '用户名或密码错误'
return HttpResponse(json.dumps(ret))
return render(request,'ajax_demo.html')

4.templates/ajax_demo.html

<!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()},
//jQuery自动转换类型,无需自己转换
dataType: 'json',
success: function (data) {
//data字符串 {status:True, message:''}
//自己转换,没有使用jQuery的类型转换
//var data_dict = JSON.parse(data);
if (data.status) {
location.href = 'http://www.bing.com.cn';
}else {
alert(data.message);
}
}
})
}
</script>
</body>
</html>

四、Model

Model -- Django ORM
a、创建数据库表(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做输入验证
memo = models.TextField() # text b、python3 manage.py makemigrations
python3 manage.py migrate
b、操作数据库的数据 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 文件 #字符串 c、连表结构
一对多:models.ForeignKey(其他表)
多对多:models.ManyToManyField(其他表)
一对一:models.OneToOneField(其他表)
obj = model.UserInfo.objects.filter(name='alex')
#打印SQL语句
print(obj)
quertset -> python, Django的类
[obj1,obj2,obj3,obj4,obj5] obj = model.UserInfo.objects.filter(name='alex').values('id','email')
[{'id':1,'email':11@qq.com},{'id':2',email':11@qq.com},{'id':3,'email':11@qq.com},{'id':4,'email':11@qq.com},] obj = model.UserInfo.objects.filter(name='alex').value_list('id','email')
[(1,'1.qq.com'),(2,'2.qq.com'),(3,'3.qq.com'),(4,'4.qq.com'),] e、了不起的双下划线
# 获取个数
#
# models.Tb1.objects.filter(name='seven').count() # 大于,小于
#
# models.Tb1.objects.filter(id__gt=1) # 获取id大于1的值
# models.Tb1.objects.filter(id__lt=10) # 获取id小于10的值
# models.Tb1.objects.filter(id__lt=10, id__gt=1) # 获取id大于1 且 小于10的值 # in
#
# models.Tb1.objects.filter(id__in=[11, 22, 33]) # 获取id等于11、22、33的数据
# models.Tb1.objects.exclude(id__in=[11, 22, 33]) # not in # contains
#
# models.Tb1.objects.filter(name__contains="ven")
# models.Tb1.objects.filter(name__icontains="ven") # icontains大小写不敏感
# models.Tb1.objects.exclude(name__icontains="ven") # range
#
# models.Tb1.objects.filter(id__range=[1, 2]) # 范围bettwen and # 其他类似
#
# startswith,istartswith, endswith, iendswith, # order by
#
# models.Tb1.objects.filter(name='seven').order_by('id') # asc
# models.Tb1.objects.filter(name='seven').order_by('-id') # desc # limit 、offset
#
# models.Tb1.objects.all()[10:20] # group by
from django.db.models import Count, Min, Max, Sum
# models.Tb1.objects.filter(c1=1).values('id').annotate(c=Count('num'))
# SELECT "app01_tb1"."id", COUNT("app01_tb1"."num") AS "c" FROM "app01_tb1" WHERE "app01_tb1"."c1" = 1 GROUP BY "app01_tb1"."id"

app01/models.py

from django.db import models

class UserType(models.Model):
name = models.CharField(max_length=32) def __str__(self):
return self.name class userinfo(models.Model):
nid = models.AutoField(primary_key=True)
# admin中字段显示名:verbose_name='用户名',数据库中的列名:db_column='u'
#是否可以被编辑:editable,error_message="用户名不能为空",help_text:admin中提示帮助信息
#
name = models.CharField(max_length=30, verbose_name='用户名')
email = models.EmailField()
memo = models.TextField()
#图片上传位置:upload_to
img = models.ImageField(upload_to='uoload')
# user_type字段可以为空null=True,Django中后台字段可以为空 blank=True,"UserType"加引号是为了新增的数据库表结构无论在上面还是在下面都可以执行
user_type = models.ForeignKey("UserType", null=True, blank=True) #unique
#普通用户
#超级用户
#user_type = models.OneToOneField("UserType", null=True, blank=True) #foreignkey + unique
#自动添加当前时间
# ctime = models.DateTimeField(auto_now_add=True)
# uptime = models.DateTimeField(auto_now=True) #对于固定值,直接写到内存中
gender_choices = (
(0, '男'),
(1, '女'),
)
gender = models.IntegerField(choices=gender_choices,default=1)
# 手工创建
"""
class B2G(models.Model):
boy = models.ForeignKey('Boy')
girl = models.ForeignKey('Girl')
"""
class Boy(models.Model):
name = models.CharField(max_length=32) class Girl(models.Model):
name = models.CharField(max_length=32)
#自动创建表,但是需要执行命令python3 manage.py makemigrations/python3 manage.py migrate
f = models.ManyToManyField(Boy)

day18/urls.py

from django.conf.urls import url
from django.contrib import admin
from django.conf.urls import url, include
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^web/', include('app01.urls')),
]

创建superuser用户

python manage.py createsuperuser

登录admin后台管理

http://127.0.0.1:8000/admin

Day18 Django之路由系统、模板语言、Ajax、Model的更多相关文章

  1. python 之 Django框架(路由系统、include、命名URL和URL反向解析、命名空间模式)

    12.36 Django的路由系统 基本格式: from django.conf.urls import url urlpatterns = [ url(正则表达式, views视图函数,参数,别名) ...

  2. Python学习(三十一)—— Django之路由系统

    转载自:http://www.cnblogs.com/liwenzhou/p/8271147.html Django的路由系统 Django 1.11版本 URLConf官方文档 URL配置(URLc ...

  3. Django之路由系统 Dj

    Django之路由系统   Django的路由系统 Django 1.11版本 URLConf官方文档 URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调 ...

  4. Django 基础 路由系统

    Django框架简介 MVC框架和MTV框架(了解即可) MVC,全名是Model View Controller,是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model).视图 ...

  5. Django 的路由系统

    Django 的路由系统   Django 的路由系统 路由层 urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^$',views.ho ...

  6. 6月19日 python学习总结 Django之路由系统

    Django之路由系统   Django的路由系统 Django 1.11版本 URLConf官方文档 URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调 ...

  7. Django框架----路由系统(详细)

    Django的路由系统 Django 1.11版本 URLConf官方文档 URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表. ...

  8. Django之 路由系统

    Django的路由系统 URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表:你就是以这种方式告诉Django,对于这个URL调用这 ...

  9. Django 的 路由系统

    Django 的路由系统 URL 配置(URLconf)就像Django 锁支撑网站的目录. 它的本质就是URL 与要为该URL 调用的视图函数之间的映射表. 你就是以这种方式告诉Django, 对于 ...

随机推荐

  1. 调试postgresql9.5.2最新源码

    最近在考量数据库的选型,考虑后期把数据切换到postgresql ,postgresql源码用c实现,代码很精炼完美,值得学习下 首先去pgsql官网下载最新的源码 ,然后还需要perl,bison ...

  2. 通过Navicat for MySQL远程连接的时候报错mysql 1130的解决方法

    在用本地的navicat连接服务器的mysql数据库时候出现下面的问题: 解决的方法: 解决方法: 1.改表法.可能是你的帐号不允许从远程登陆,只能在localhost.这个时候只要在localhos ...

  3. Swift开发:NSLayoutConstraint纯代码实现自动布局-初级篇

    要求 宽高200的view,通过代码,使得view在距离父控件的右下角20边距处 /* 约束的设置,控件内部约束由自己添加,比如宽高,如果是与其他的 控件约束那么有父控件添加 *创建约束 NSLayo ...

  4. TCP 连接的建立和终止

    三路握手 建立一个TCP连接时会发生下述情形. (1)服务器必须准备好接受外来的连接.这通常通过调用socket.bind和listen这3个函数来完成的,我们称之为被动打开. (2)客户通过调用co ...

  5. show()与showDialog()的区别

    A.WinForm中窗体显示  显示窗体可以有以下2种方法:  Form.ShowDialog方法 (窗体显示为模式窗体) Form.Show方法 (窗体显示为无模式窗体) 2者具体区别如下: 1.在 ...

  6. 使用dom4j对xml文件进行增删改查

    1.使用dom4j技术对dom_demo.xml进行增删改查 首选要下载dom4j的jar包 在官网上找不到,网上搜索了一下在这个链接:http://sourceforge.net/projects/ ...

  7. 三分钟学会缓存工具DiskLruCache

    DiskLruCache是一个十分好用的android缓存工具,我们可以从GitHub上下载其源码:https://github.com/JakeWharton/DiskLruCache DiskLr ...

  8. 使用CSS的类名交集复合选择器

    首先先看一下基本定义: 复合选择器就是两个或多个基本选择器,通过不同方式连接而成的选择器,主要包括“交集”选择器.“并集”选择器.“后代”选择器. 交集选择器 “交集”复合选择器是由两个选择器直接连接 ...

  9. windows向ubuntu过渡之常用编程软件安装

    不出意外的上篇文章又被踢出首页了,心情甚是悲桑..希望更多人能看到 1.安装codeblocks 直接在软件中心搜索codeblocks就可以 2.安装jdk并配置环境变量 http://www.li ...

  10. html响应式布局,css响应式布局,响应式布局入门

    html响应式布局,css响应式布局,响应式布局入门 >>>>>>>>>>>>>>>>>>& ...