1、安装Djangocss
下载地址:https://www.djangoproject.com/download/html
一、tar zxvf Django-1.8.10.tar.gzpython
二、cd Django-1.8.10mysql
三、python setup.py installgit
2、建立一个Django项目
web
django-admin startproject sitename正则表达式
经常使用命令:sql
python manage.py runserver 0.0.0.0
python manage.py startapp appname
python manage.py syncdb数据库
# 集成已有数据库的应用,经过数据库生成model类django
python manage.py inspectdb
# 经过model类生成数据库
python manage.py makemigrations
python manage.py migrate
3、URL路由
一、每一个路由规则对应一个view中的函数
from django.conf.urls import include, url from django.contrib import admin from views import * urlpatterns = [ url('^hello/$',hello), url('^time/$',current_datetime), url(r'^time/plus/(\d{1,2})/$',hours_ahead), ]
二、根据app对应路由规则的分类
url(r'^web1/',include('web1.urls'))
app:web1.urls
from django.conf.urls import include, url, patterns from django.contrib import admin from web1.views import * urlpatterns = patterns('', url(r'^add/(?P<name>\w*)&(?P<not_name>\w*)/$',Add), url(r'^del/(?P<id>\d*)/$',Delete), url(r'^Update/(?P<id>\d*)&(?P<name>\w*)/$',Update), )
添加app到框架应用
INSTALLED_APPS = ( 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'ops01', )
4、数据库操做
一、配置:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME':'dbname', 'USER': 'root', 'PASSWORD': 'xxx', 'HOST': '', 'PORT': '', } }
二、根据models.Model建立数据表
#!/usr/local/python27/bin/python2.7 # coding:utf8 # Create your models here. from django.db import models class UserInfo2(models.Model): username = models.CharField(max_length=50) password = models.CharField(max_length=50) memo = models.CharField(max_length=50) class args(models.Model): id = models.AutoField(primary_key = True) name = models.CharField(max_length=20,null=True) not_name = models.CharField(max_length=20,null=False) create_data = models.DateTimeField(auto_now_add = True) update_date = models.DateTimeField(auto_now = True,error_messages={"invalid":'日期格式错误'})
三、更多字段:
一、models.AutoField # 自增列 = int(11) 若是没有的话,默认会生成一个名称为 id 的列,若是要显示的自定义一个自增列,必须将给列设置为主键 primary_key=True。 二、models.CharField # 字符串字段必须 max_length 参数 三、models.BooleanField 布尔类型=tinyint(1) # 不能为空,Blank=True 四、models.ComaSeparatedIntegerField # 用逗号分割的数字=varchar 继承CharField,因此必须 max_lenght 参数 五、models.DateField # 日期类型 date 对于参数,auto_now = True 则每次更新都会更新这个时间;auto_now_add 则只是第一次建立添加,以后的更新再也不改变。 六、models.DateTimeField # 日期类型 datetime 同DateField的参数 七、models.Decimal # 十进制小数类型 = decimal 必须指定整数位max_digits和小数位decimal_places 八、models.EmailField # 字符串类型(正则表达式邮箱)=varchar 对字符串进行正则表达式 九、models.FloatField # 浮点类型 = double 十、models.IntegerField # ××× 十一、models.BigIntegerField # 长××× integer_field_ranges = { 'SmallIntegerField': (-32768, 32767), 'IntegerField': (-2147483648, 2147483647), 'BigIntegerField': (-9223372036854775808, 9223372036854775807), 'PositiveSmallIntegerField': (0, 32767), 'PositiveIntegerField': (0, 2147483647), } 十二、models.IPAddressField # 字符串类型(ip4正则表达式) 1三、models.GenericIPAddressField # 字符串类型(ip4和ip6是可选的) # 参数protocol能够是:both、ipv四、ipv6 # 验证时,会根据设置报错 1四、models.NullBooleanField # 容许为空的布尔类型 1五、models.PositiveIntegerFiel # 正Integer 1六、models.PositiveSmallIntegerField # 正smallInteger 1七、models.SlugField # 减号、下划线、字母、数字 1八、models.SmallIntegerField # 数字 数据库中的字段有:tinyint、smallint、int、bigint 1九、models.TextField # 字符串=longtext 20、models.TimeField # 时间 HH:MM[:ss[.uuuuuu]] 2一、models.URLField # 字符串,地址正则表达式 2二、models.BinaryField # 二进制 2三、models.ImageField # 图片 2四、models.FilePathField # 文件
四、更多字段参数:
一、null=True # 数据库中字段是否能够为空 二、blank=True # django的 Admin 中添加数据时是否可容许空值 三、primary_key = False # 主键,对AutoField设置主键后,就会代替原来的自增 id 列 四、auto_now 和 auto_now_add # auto_now 自动建立---不管添加或修改,都是当前操做的时间 # auto_now_add 自动建立---永远是建立时的时间 五、choices # GENDER_CHOICE = ( # (u'M', u'Male'), # (u'F', u'Female'), # ) # gender = models.CharField(max_length=2,choices = GENDER_CHOICE) 六、max_length 七、default # 默认值 八、verbose_name # Admin中字段的显示名称 九、name|db_column # 数据库中的字段名称 十、unique=True # 不容许重复 十一、db_index = True # 数据库索引 十二、editable=True # 在Admin里是否可编辑 1三、error_messages=None # 错误提示 1四、auto_created=False # 自动建立 1五、help_text # 在Admin中提示帮助信息 1六、validators=[] 1七、upload-to
五、数据库操做
from django.shortcuts import render from web1.models import * from django.http import HttpResponse from django.db.models import Min,Max,Sum from django.db import connection,transaction # Create your views here. # 添加数据 def Add(request,name,not_name): args.objects.create(not_name=not_name,name=name) return HttpResponse('ok') # 删除数据 def Delete(request,id): args.objects.get(id=id).delete() return HttpResponse('delete ok') # 更新数据,单行更新 def Update(request,id,name): obj = args.objects.get(id=id) obj.name = name obj.save() return HttpResponse('update ok') # 根据id大于等于的条件,多行更新 args.objects.filter(id__gt=id).update(name=name) return HttpResponse('multi update ok') # 根据id小于等于的条件,多行更新,也能够用于多行删除 args.objects.filter(id__lt=id).update(name=name) return HttpResponse('multi update ok') # 根据等于的条件多行操做 args.objects.filter(id=id).update(name=name) return HttpResponse('multi update ok') #还能够经过filter(id__in = [1,2,3])进行多行操做 # 模糊查询 obj = args.objects.filter(name__contains=name) # 模糊查询(忽略大小写) obj = q.exclude(body_text__icontains="food") # -------- 条件查询更多参数 ------------- # 表示!= exclude # 去重复 querySet.distinct() # 精确等于 like 'aaa' __exact # 精确等于 忽略大小写 ilike 'aaa' __iexact # 包含 like '%aaa%' __contains # 包含,忽略大小写 ilike '%aaa%',可是对于sqlite来讲,contains的做用效果等同于icontains。 __icontains # 大于 _gt # 大于等于 __gte # 小于 __lt # 小于等于 __lte # 存在于一个list范围内 __in # 以...开头 __startswith # 以...开头 忽略大小写 __istartswith # 以...结尾 __endswith # 以...结尾,忽略大小写 __iendswith # 在...范围内 __range # 日期字段的年份 __year # 日期字段的月份 __month # 日期字段的日 __day # 空集 __isnull=True/False # 扩展学习,示例 # 大于 p1 = Permission.objects.all().filter(content_type_id__gt=12) # 大于等于 p1 = Permission.objects.all().filter(content_type_id__gte=12) # 去重 p1 = Permission.objects.all().filter(content_type_id__gte=12).distinct() # 前缀查询 q1 = Entry.objects.filter(headline__startswith="What") # 排除 q2 = q1.exclude(pub_date__gte=datetime.date.today()) # 操做时间 q1.filter(pub_date__gte=datetime.date.today())表示为时间>=now, q1.exclude(pub_date__gte=datetime.date.today())表示为<=now ''' 关于缓存: queryset是有缓存的,a = A.objects.all(),print [i for i in a]. 第一次执行打印会查询数据库,而后结果会被保存在queryset内置的cache中, 再执行print的时候就会取自缓存。 不少时候会遇到仅需判断queryset是否为空的状况,能够 1. if queryset:pass 2.if queryset.count>0:pass 3.if queryset.exists():pass. 三种方式性能依次提高。 当queryset很是巨大时,cache会成为问题。 此时能够queryset.iterator(),迭代器的用处就很少说了,根据具体需求状况使用。 ''' # 经过values()指定获取单列数据。 alldata = args.objects.all().values('id') alldata = args.objects.values('id') # 获取单列去重数据 alldata = args.objects.values('id').distinct() # 获取指定行数据,[0:3] 从0行开始向下获取3行数据 def get_limit(request): alldata = args.objects.all()[0:3] print alldata.query return HttpResponse(alldata) # 排序 ,(‘-id’)为逆序 alldata = args.objects.all().order_by('id') alldata = args.objects.all().order_by('-id') # 聚合函数 def juhe(request): alldata = args.objects.aggregate(Max('id')) print alldata return HttpResponse(alldata) # 使用自定义的原生SQL语句 ''' cursor = connection.cursor() cursor.execute('SELECT DISTINCT first_name ROM people_person WHERE last_name = %s', ['Lennon']) row = cursor.fetchone() ''' # 实例: def sour_sql(request,id): cursor = connection.cursor() cursor.execute('''SELECT id FROM web1_args where id > %s ''' % id ) row = cursor.fetchall() print row return HttpResponse(row) # 经过调用SQL 函数inet_aton()将IP地址转为INT格式存储 cursor = connection.cursor() cursor.execute("SELECT inet_aton('%s')" % wip) data = cursor.fetchall() sqldatawip = data[0][0] cursor.execute("SELECT inet_aton('%s')" % lip) data = cursor.fetchall() sqldatalip = data[0][0]
5、模版语言
一、模版文件夹路径配置
Django1.8 setting.py
TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', # 配置模版文件夹路径 'DIRS': [os.path.join(BASE_DIR, 'templates')] , 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', ], }, }, ]
二、判断语句编写格式
# 判断 {% if not user %} <h2>have data</h2> {% else %} <h2>haven't data</h2> {% endif %} # 取反判断 {% if not user %} <h2>have data</h2> {% else %} <h2>haven't data</h2> {% endif %} # ifequal/ifnotequal 等价判断,user 是否等于 'tuchao' {% ifequal user 'tuchao' %} <h3>right!</h3> {% else %} <h3>error!</h3> {% endifequal %}
三、循环语句编写
# 循环装有数据的表格,使得页面中有格式的显示数据 {% for item in data %} <tr> <td>`item`.`id`</td> <td>{% mymethod item.id %}</td> <td>`item`.`name`</td> <td>`item`.`not_name`</td> <td>{{item.create_data|date:"Y-m-d H:i:s"}}</td> <td>{{item.update_date|date:"Y-m-d H:i:s"}}</td> </tr> {% endfor %} # 给标签增长一个 reversed 使得该列表被反向迭代: {% for athlete in athlete_list reversed %} ... {% endfor %} # 先检查列表是否有数据再循环 {% if athlete_list %} {% for athlete in athlete_list %} <p>{{ athlete.name }}</p> {% endfor %} {% else %} <p>There are no athletes. Only computer programmers.</p> {% endif %} # `` for`` 标签支持一个可选的`` {% empty %}`` 分句,经过它咱们能够定义当列表为空时的输出内容 下面的例子与以前那个等价: {% for athlete in athlete_list %} <p>{{ athlete.name }}</p> {% empty %} <p>There are no athletes. Only computer programmers.</p> {% endfor %} # forloop.counter 老是一个表示当前循环的执行次数的整数计数器。 这个计数器是从1开始的,因此在第一次循环时 forloop.counter 将会被设置为1。 {% for item in todo_list %} <p>{{ forloop.counter }}: {{ item }}</p> {% endfor %} # forloop.last 是一个布尔值;在最后一次执行循环时被置为True。 一个常见的用法是在一系列的连接之间放置管道符(|) {% for link in links %}{{ link }}{% if not forloop.last %} | {% endif %}{% endfor %} # 上面的模板可能会产生以下的结果: Link1 | Link2 | Link3 | Link4 # 另外一个常见的用途是为列表的每一个单词的加上逗号。 # Favorite places: {% for p in places %}{{ p }}{% if not forloop.last %}, {% endif %}{% endfor %}
四、过滤器
模版过滤器是在变量被显示前修改它的值的一个简单方法
# 内容变量 name 被过滤器lower处理-转换文本为小写 {{ name|lower }} # 过滤管道能够被* 套接* ,既是说,一个过滤器管道的输出又能够做为下一个管道的输入 # 实现查找列表的第一个元素并将其转化为大写 {{ my_list|first|upper }} # 显示 bio变量的前30个字符 {{ bio|truncatewords:"30" }} # date 按照指定的格式,格式化date和datetime对象 {{create_data|date:"Y-m-d H:i:s"}} {{update_date|date:"Y-m-d H:i:s"}} {{delete_date|date:"F j, Y" }} # addslashes : 添加反斜杠到任何反斜杠、单引号或者双引号前面。 这在处理包含JavaScript的文本时是很是有用的。
五、自定义模版方法
一、在app目录下建立templatetags文件夹,用于保存自定义方法文件
二、建立__init__.py文件
三、建立任意.py文件编写自定义方法
# 代码实例 hand.py #!/usr/local/python27/bin/python2.7 #coding:utf-8 from django import template from django.template.base import resolve_variable, Node, TemplateSyntaxError register = template.Library() #上面的均为固定格式,注意这里定义的方法必须被本身实例化的对象里的装饰器@register.simple_tag)进行装饰才有效 @register.simple_tag def mymethod(v1): result = v1*1000 return result
Html调用自定义模版方法
{% extends "master/moban.html" %} {% block content %} <!-- 载入自定义方法文件 --> {% load hand %} <table border='1'> {% for item in data %} <tr> <td>`item`.`id`</td> <!-- 调用自定义方法,将id值乘1000返回 --> <td>{% mymethod item.id %}</td> <td>`item`.`name`</td> <td>`item`.`not_name`</td> </tr> {% endfor %}
六、模版的继承
当咱们在开发一个动态站点的时候,会发如今整个站点中不少页面的样式,图片、Logo、导航栏等等都有相同的部分,那咱们如何减小这些冗余代码呢? 下面经过学习父板及子板继承关系的方式来解决
# 定义一个父模版,其中的block块是子板能够重载的部分。 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"> <html lang="en"> <head> <title>{% block title %}{% endblock %}</title> </head> <body> <h1>My helpful timestamp site</h1> {% block content %}{% endblock %} {% block footer %} <hr> <p>Thanks for visiting my site.</p> {% endblock %} </body> </html> # 建立一个子板,继承父模版 # 该标记用于指定继承自哪一个父模版,必须保证其为模板中的第一个模板标记。 不然,模板继承将不起做用。 {% extends "base.html" %} # 重载子板的title部分 {% block title %}The current time{% endblock %} # 重载子板的内容部分 {% block content %} <p>It is now {{ current_date }}.</p> {% endblock %} # 这个子模版的title 和 body 内容部分都本身定制不继承自父模版,剩下没有被重载的任何部分都继承自父模版,如{% block footer %} 部分。
6、Django-form表单
Django 提供一个form.Form类能够快速实现表单的功能,并且提供便捷的方式解决了验证提交数据的格式是否合法的问题。
一、在app目录下建立一个forms.py的文件
# 实例代码 #!/usr/local/python27/bin/python2.7 # coding=utf8 # noinspection PyUnresolvedReferences from django import forms # 定义一部分须要用到的表单,attrs属性用于定义该表单的样式信息。 指定的样式须要在对应的CSS文件中编写。 class RegisterForm(forms.Form): username = forms.CharField(widget=forms.TextInput(attrs={'class':'user_name'})) password = forms.CharField(widget=forms.PasswordInput(attrs={'class':'pwd'})) real_name = forms.CharField(widget=forms.TextInput) email = forms.EmailField(required=True,error_messages={'invalid':'邮箱格式错误'}) gender = forms.BooleanField() class AdminHostAdd(forms.Form): othername = forms.CharField(widget=forms.TextInput(attrs={'class':'othername'})) hostname = forms.CharField(widget=forms.TextInput(attrs={'class':'hostname'})) hardconfig = forms.CharField(widget=forms.TextInput(attrs={'class':'hardconfig'})) wip = forms.IPAddressField() lip = forms.IPAddressField()
二、views.py 文件中调用实例代码
#!/usr/local/python27/bin/python2.7 # coding=utf8 # noinspection PyUnresolvedReferences from django.shortcuts import render # 从定义的forms.py文件中导入类 from ops01.forms import RegisterForm,AdminHostAdd from django.http import HttpResponse from django.shortcuts import render_to_response from ops01.models import * from django.db import connection,transaction # 用户注册函数 def Register(request): reg = RegisterForm() # 实例化 if request.method == 'POST': form = RegisterForm(request.POST) # 判断提交的表单数据,是否符合表单定义的数据格式。 if form.is_valid(): # 获取提交的全部数据,这里会返回一个字典对象 data = form.cleaned_data username = data.get('username') password = data.get('password') realname = data.get('real_name') email = data.get('email') try: # 数据库操做,将合法的数据记录到数据库 user.objects.create(username=username,password=password,realname=realname,email=email) except e: print (e) print data else: temp = form.errors.as_data() print temp print type(temp) # 在返回结果的时候将实例化的form对象reg嵌套进Html一块儿返回 return render_to_response('register.html',{'form':reg,'status':'注册失败'}) return render_to_response('register.html',{'form':reg}) # 主机信息添加函数 def hostinfoadd(request): hostadd = AdminHostAdd() if request.method == 'POST': form = AdminHostAdd(request.POST) if form.is_valid(): data = form.cleaned_data hostname = data.get('hostname') othername = data.get('othername') wip = data.get('wip') lip = data.get('lip') hardconfig = data.get('hardconfig') cursor = connection.cursor() cursor.execute("SELECT inet_aton('%s')" % wip) data = cursor.fetchall() sqldatawip = data[0][0] cursor.execute("SELECT inet_aton('%s')" % lip) data = cursor.fetchall() sqldatalip = data[0][0] try: host.objects.create(othername=othername,hostname=hostname,wanip=sqldatawip,lanip=sqldatalip,hardconfig=hardconfig) except e: print e return render_to_response('admin-host-add.html',{'form':hostadd,'status':'记录添加成功!'}) else: return render_to_response('admin-host-add.html',{'form':hostadd,'status':'数据格式错误!'}) return render_to_response('admin-host-add.html',{'form':hostadd})
三、对应的部分Html实例代码
# 注册页面 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>帐户注册</title> <style type="text/css" > .title{ font-size: 25px; font-weight: bold; display: block; margin-left: 46%; margin-top: 40px; } .regdiv{ background: #FFF; height: 500px; width: 450px; left: 470px; position: relative; top: 53px; } .reghead{ height: 41px; position: absolute; width: 100%; top: 30px; line-height: 0px; border-bottom: 1px solid #F2F2F2; } .reghead h3{ font-size: 21px; left: 19px; display: block; position: absolute; } .r_name{ height: 50px; position: absolute; width: 100%; top: 105px; left: 12px; } .u_name{ height: 30px; position: absolute; width: 100%; top: 180px; left: 12px; } .passwd{ height: 30px; position: absolute; top: 255px; left: 12px; } .mail{ height: 30px; top: 327px; position: absolute; width: 100%; left: 12px; } .mail input{ height:30px; width: 300px; } .r_name input{ width: 300px; height: 30px; } .user_name { height: 30px; width: 300px; } .pwd{ width: 300px; height: 30px; } .sub { height: 32px; position: absolute; bottom: 42px; left: 83px; } .sub input { padding: 8px; width: 300px; background-color: rgb(53, 84, 146); font-size: 20px; font-weight: bold; color: #FFF; } .gd{ bottom: 94px; left: 80px; font-size: 14px; position: absolute; } .failstatus{ color: #ff2d28; width: 222px; display: block; position: absolute; height: 51px; left: 141px; top: 32px; font-size: 28px; font-family: "Microsoft YaHei"; font-weight: bold; letter-spacing: 14px; } </style> </head> <body style="background:#D6E4FF; margin:0px auto; height:920px;"> <span class="title">Regsiter Page</span> <div class="regdiv"> <div class="reghead"><h3>注册</h3></div> <!-- 经过模版语言调用经过 render_to_response 方法传入的字典对象 --> <span class="failstatus">{{ status }}</span> <form action="/ops01/reg/" method="post"> <!-- 经过模版语言的格式调用form --> <div class="r_name">真实姓名:{{ form.real_name }}</div> <div class="u_name">用 户 名:{{ form.username }}</div> <div class="passwd">密 码:{{ form.password }}</div> <div class="mail">邮 箱:{{ form.email }}</div> <div class="gd">{{ form.gender }}我已经赞成<a href="#">隐私政策、服务条款</a></div> <div class="sub"><input type="submit" value="注 册" /></div> </form> </div> </body> </html> <!-- -------------------------------------------------------------------------------- --> <!-- 主机信息添加页 --> {% extends "masterplate.html" %} {% block title %}主机添加{% endblock %} {% block content %} <div class="admin-content-admin-host-add content_font"> <div class="am-cf am-padding"> <div class="am-fl am-cf"><strong class="am-text-primary am-text-lg">主机信息添加</strong> / <small>Host information add</small></div> </div> <hr /> <form action="/ops01/hostadd/" method="post"> <div style="margin-left: 20px;"> 主机名<hr /> {{ form.hostname }}<hr /> </div> <div style="margin-left: 20px;"> 别名<hr /> {{ form.othername }}<hr /> </div> <div style="margin-left: 20px;"> 外网IP<hr /> <div class="wipdiv">{{ form.wip }}</div><hr /> </div> <div style="margin-left: 20px;"> 内网IP<hr /> <div class="lipdiv">{{ form.lip }}</div><hr /> </div> <div style="margin-left: 20px;"> 硬件配置<hr /> {{ form.hardconfig }}<hr /> </div> <span class="hostaddstatus">{{ status }}</span> <div class="hostaddbottomdiv"><input type="submit" class="hostaddbottom" name="hostinfosubmit" value="提交至数据库" /></div> </form> </div> {% endblock %} <!-- -------------------------------------------------------------------------------- --> <!-- 主机列表页面 --> {% extends "masterplate.html" %} {% block title %}主机列表{% endblock %} {% block content %} <div class="admin-content"> <div class="am-cf am-padding"> <div class="am-fl am-cf"><strong class="am-text-primary am-text-lg">主机列表</strong> / <small>Host information</small></div> </div> <table border="1" class="hovertable"> <tr> <th>主机ID</th><th>主机名</th><th>所属业务</th><th>内网IP</th><th>外网IP</th><th>配置信息</th> </tr> {% for i in list %} <tr onmouseover="this.style.backgroundColor='#ffff66';" onmouseout="this.style.backgroundColor='#d4e3e5';"> <td>{{ i.hid }}</td> <td>{{ i.hostname }}</td> <td>{{ i.othername }}</td> <td>{{ i.wanip }}</td> <td>{{ i.lanip }}</td> <td>{{ i.hardconfig }}</td> </tr> {% endfor %} </table> </div> {% endblock %}
7、静态文件存放配置
STATIC_URL = '/static/' STATICFILES_DIRS = ( os.path.join(BASE_DIR,'static'), )