python老师武_django 武沛齐老师-最后一篇随笔

安装

pip install django==1.11.14 -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com

卸载

pip uninstall django

创建 django 项目

django-admin startproject 项目名

django-admin startproject victory

运行 django 项目

cd victory

python manage.py runserver

创建 app

python manage.py startapp app名称

python manage.py startapp app01

urls 文件

urlpatterns=[ ] 对应 url 映射的列表

urlpatterns=[

url(r'^网址名称/', 包模块.函数名),

url(r'^网址名称/', 函数名),

]

wsgi 一套规则,接口,创建 socket

产品上线不使用默认的 wsgi , 使用 uwsgi+nginx

manage.py 管理 django 程序

settings 配置文件

app 注册

app 名称.apps.app 名称Config 或 app 名称

app01.apps.App01Config 或 app01

templates 模板注册'DIRS': [os.path.join(BASE_DIR, 'templates')],

配置静态文件夹static创建static静态文件夹

STATICFILES_DIRS=(

os.path.join(BASE_DIR,'static'),

)

设置中文

LANGUAGE_CODE= 'zh-hans'设置时区

TIME_ZONE= 'Asia/Shanghai'设置数据库为 mysql (注:先安装 mysqlclient, pip install mysqlclient)

DATABASES={'default': {'ENGINE': 'django.db.backends.mysql','NAME': '数据库名称','USER':'用户名','PASSWORD':'密码','HOST':'127.0.0.1','PORT':'3306'}

}

DATABASES={'default': {'ENGINE': 'django.db.backends.mysql','NAME': 'app02','USER':'root','PASSWORD':'root','HOST':'127.0.0.1','PORT':'3306'}

}

ORM 对象关系映射,创建数据库表不需要使用select , insert 语句了

数据库迁移

python manage.py makemigrations

python manage.py migrate

app 目录

migrations 记录做过哪些修改数据表结构的操作

__init__ 文件,python3 可以删除,python2 不可以删除

python2 默认 不带 __init__ 文件为普通文件夹,导入会报错

admin 后台管理

在 admin 中,导入 app 的 models 文件fromapp01 import models

将 models 里面的数据表进行注册

admin.site.register(models.UserInfo)

admin.site.register(models.UserType)

两张表内容如下classUserType(models.Model):

name= models.CharField(max_length=32)classUserInfo(models.Model):

username= models.CharField(max_length=32)

pwd= models.CharField(max_length=32)

email= models.CharField(max_length=32)

user_type= models.ForeignKey('UserType')

# 使用''将类名包裹,进行创建外键

创建超级用户

python manage.py createsuperuser

示例:

用户名 hany

密码 hany12345.

超级用户登录后,可以对数据表增加数据等操作

apps 配置当前 app

models ORM 操作,通过命令创建数据库表结构

tests 单元测试

views 业务逻辑文件,写函数

伪装数据库

项目的 __init__ 文件下

import pymysql

pymysql.install_as_MySQLdb()

生命周期

用户发送请求到路由系统,如果匹配成功,执行相对应的 views 中的函数

到数据库中取出数据,在模板 html 上进行页面渲染数据 返回到用户的浏览器上

urls 操作

url(r'^路由映射/', views.函数名),

url(r'^register/', views.register),

url(r'^路由映射-(?P\d+).html', views.函数名),

url(r'^detail-(?P\d+).html', views.detail),

url(r'路由映射',include("app名称.urls"))

url(r'app02',include("app02.urls"))

注:include 内参数加引号,urls 需要自己创建

在用户创建的 urls 中,继续进行地址映射,写在 urlpatterns=[ ]中

app 不要忘记在 settings 中进行注册

models 操作

创建数据表时,继承 models.Model

示例classUserInfo(models.Model)

创建字符串类型数据 models.CharField

示例

username= models.CharField(max_length=32)

id 主键会自动创建,并递增

使用 AutoField,并且声明主键 primary_key=True 可以不让系统创建 id 列

示例

uid= models.AutoField(primary_key=True)

字段参数null字段是否为空default默认值

示例

code= models.CharField(max_length=32,null=True,default="SA")

primary_key 主键

db_column 列名

db_index 索引 , unique 唯一索引

unique_for_date 对日期做索引,unique_for_month 对月做索引, unique_for_year 对年做索引

auto_now=True 创建时生成时间

示例

ctime= models.DateField(auto_now=True,null=True)

auto_now_add=True 修改时自动更新时间

choice 选项

示例 , choices 为 一个嵌套的元组对象

user_type_choices=(

(1,'super man'),

(2,'common man'),

(3,'man'),

)

user_type_id= models.IntegerField(choices=user_type_choices,default=2)

verbose_name 备注字段

editable 字段是否可以被编辑

help_text 字段输入提示

validators 自定义错误信息

to_field 与哪一列进行关联

创建整数类型数据 models.IntegerField

示例

user_type_id= models.IntegerField(choices=user_type_choices,default=2)

外键关联 models.ForeignKey

示例 第一个参数为类名,uid 为关联的字段

usergroup= models.ForeignKey('UserGroup',to_field='uid')

会自动生成 usergroup_id 列,usergroup 为对象,可以使用 usergroup.uid 进行获取外联表的数据

创建 ip

示例 , protocol默认为'both'ip= models.GenericIPAddressField(protocol="ipv4",db_index=True)

多对多 , 不能加额外字段列

models.ManyToManyField('类名')

一对多,多对多示例classBusiness(models.Model):

caption= models.CharField(max_length=32)

code= models.CharField(max_length=32,null=True,default="SA")classHost(models.Model):

nid= models.AutoField(primary_key=True)

hostname= models.CharField(max_length=32,db_index=True)

ip= models.GenericIPAddressField(protocol="ipv4",db_index=True)

port=models.IntegerField()

b= models.ForeignKey(to="Business", to_field='id')classApplication(models.Model):

name= models.CharField(max_length=32)

r= models.ManyToManyField("Host")

注:会自动创建一个新的表,内部为其他表的 id 主键

obj= Application.objects.get(id=1)

增加数据

obj.r.add(1)

obj.r.add(1,2,3)

obj.r.add(*[1,2,3])

删除数据

obj.r.remove(2,4,5)

obj.r.clear()

更新数据

obj.r.set([3,5,7])

多对多 , 自定义创建第三张表 , 可以自己定义第三张表的字段

示例classHostApp(models.Model):

hobj= models.ForeignKey(to='Host',to_field='nid')

aobj= models.ForeignKey(to='Application',to_field='id')

status= models.CharField(max_length=32)

增加数据

HostApp.objects.create(hobj_id='xxx',aobj='xxx',status='xxx')

html 操作

导入 jquery导入静态文件使用 {{ 变量名 }} 进行显示变量{{ error_msg }}

for循环

{% for 对象 in 传递过来字典的键 %}

  • {{ 对象 }}
{% endfor %}

遍历字典中的键

{% for num in user_num.keys %}

  • {{ num }}
{% endfor %}

遍历字典中的值

{% for num in user_num.values %}

  • {{ num }}
{% endfor %}

遍历字典的所有元素

{% for key,value in user_num.items %}

  • {{ key }} - {{ value }}
{% endfor %}

遍历列表

{% for name in user_list %}

  • {{ name }}
{% endfor %}

取索引对象

第一个元素

对象.0 {{ user_list.0}}

对应索引元素名

对象.元素名 {{ user_num.zero }}if语句

{% if 条件%}

语句

{% else %}

语句

{% endif %}

{% if 条件 %}

语句

{% elif 条件 %}

语句

{% else %}

语句

{% endif %}

跳转链接 href内容示例 , 跳转到 app02 下的 student 中学生管理循环计数 forloop

从1开始

{{ forloop.counter }}

从0开始

{{ forloop.counter0 }}

是否是第一个 , 返回 True 或 False

{{ forloop.first }}

是否是最后一个 , 返回 True 或 False

{{ forloop.last }}

倒序到1为止

{{ forloop.revcounter }}

倒序到0为止

{{ forloop.revcounter0 }}

上一层循环

{{ forloop.parentloop }}

ajax

$.ajax({

url:"路由地址",

type:"GET 或 POST 请求方式",

data:数据, data: $('#select 标签的 id 值').serialize(), 获取序列化数据

dataType:'数据类型'success: function(data){

对获取到的数据 data 要进行的操作

JSON.parse(data) 对返回的字符串转换为对象

location.reload(), 刷新

location.href= '某个地址', 跳转

}

}

views 操作

形参可以使用 request ,*args , **kwargs

request.method 提交方式

GET , POST 以及其他方式

request.environ 获取所有的请求信息

获取 cookies

request.COOKIES

获取用户输入的值

request.POST['html 中的name 属性的值']

request.POST.get('html 中的name 属性的值',None)

password= request.POST.get('password',None)

request.POST.getlist('html 中的name 属性的值')

request.POST.getlist('favor')

返回页面上显示的字符串return HttpResponse('字符串标签名>')return HttpResponse('

Hello

')

页面跳转return redirect('网址')return redirect('/home/')

注: home 前面的/ 为 ip : 端口号/页面渲染return render(request,'html文件名.html'[,变量])return render(request,'login.html')return render(request,'login.html',{'error_msg':error_msg})

注: 字典的键为在 html 中使用的变量名称

数据库增删改查

字段值大于1的

models.类名.objects.filter(字段__gt=1)

字段值大于等于1的

models.类名.objects.filter(字段__gte=1)

字段值等于1的

models.类名.objects.filter(字段=1)

字段值小于1的

models.类名.objects.filter(字段__lt=1)

字段值小于等于1的

models.类名.objects.filter(字段__lte=1)

获取指定字段的值

models.类名.objects.all().values('字段1','字段2')

注:返回的是 QuerySet 类型,内部为字典对象

models.类名.objects.all().values_list('字段1','字段2')

注:返回的是 QuerySet 类型,内部为元组对象

示例

models.UserInfo.objects.all().values('username', 'password')

获取文件

注: 在文件上传时,在 form 表单中加入 enctype="multipart/form-data"表示上传的是文件

上传的文件到 request.FILES 中进行查找

file= request.FILES.get('html 中的name 属性的值')

file.chunks() 一个可迭代对象,包含有上传的文件

file.name 文件名

file.size 文件大小

获取上传文件示例(fff 为 name 的值,upload为在项目根路径下创建的文件夹):

file= request.FILES.get('fff')

import os

file_location= os.path.join('upload',file.name)

f= open(file_location,mode = 'wb')for i infile.chunks():

f.write(i)

f.close()

根据用户点击的不同,生成不同的详细信息

示例:

views 中:

user_info={'1':['xiaoming','nv','21'],'2':['xiaolang','nan','22'],'3':['xiaomi','nv','23'],'4':['xiaole','nan','24'],

}

def index(request):return render(request,'index.html',{'user_info':user_info})

def detail(request,cid):

detail_info=user_info[cid]return render(request,'detail.html',{'detail_info':detail_info})

urls 中

url(r'^detail-(?P\d+).html',views.detail),

在括号中写入?P表示传递给形参 cid

html

index 中

{% for user_key in user_info.keys %}{{ user_key }}
{% endfor %}

detail 中

详细信息

用户名:{{ detail_info.0 }}
性别:{{ detail_info.1 }}
年龄:{{ detail_info.2 }}
获取当前 url

request.path_info

增加数据

第一种

models.类名.objects.create(

字段1=值1,

字段2=值2,

...

)

示例

models.UserInfo.objects.create(

username='www',

password='111')

第二种

obj= models.类名(字段1=值1,字段2=值2)

obj.save()

示例

obj= models.UserInfo(username='two',password='...')

obj.save()

查询数据

查询全部数据

models.类名.objects.all()

示例 username 为字段名

all=models.UserInfo.objects.all()for user inall:

print(user.username,user.password)

查询指定某一行数据

models.类名.objects.filter(字段1=值1[,字段2=值2])

示例,对查询到数据可以进行循环输出数据

result= models.UserInfo.objects.filter(username='hany')for user inresult:

print(user.username,user.password)

示例 , 获取外键所在表的数据 , 外键名为 b 通过.进行获取数据,b_id 为在表中的字段

v1= models.Host.objects.filter(nid=1).first()

print(v1.nid,v1.hostname,v1.ip,v1.port,v1.b_id)

print(v1.b.id,v1.b.caption)

注:如果报错,可以考虑使用 __ 进行查询 b__caption

v2= models.Host.objects.filter(nid=1)

print(v2.values('b__caption'))

删除数据

删除全部数据

models.类名.objects.all().delete()

示例

models.UserInfo.objects.all().delete()

删除一条数据

models.类名.objects.filter(条件).delete()

示例

models.UserInfo.objects.filter(username='www').delete()

更新数据

更新全部数据

models.类名.objects.all().update(字段=值)

示例

models.UserInfo.objects.all().update(password='666')

更新一条数据

models.类名.objects.filter(条件).update(字段=值)

示例

models.UserInfo.objects.filter(id=1).update(password='111')

filter 后可以跟

count() 获取数据个数

示例 , 当不存在对应数据时,obj_count 为0obj_count= models.UserInfo.objects.filter(username=username,password=password).count()

print(obj_count)

first() 获取第一条数据

示例 , 使用了 first 之后,可以使用对象直接输出字段值

obj= models.UserInfo.objects.filter(username=username,password=password).first()

print(obj.username)

登录示例 , 没有获取到数据为 Noneifnot obj:

error_msg= 'name or password is error'

return render(request,'登录.html',{'error_msg':error_msg})else:return render(request, '主页.html')

问题

SyntaxError: Generator expression must be parenthesized (widgets.py, line152) 问题

去掉最后面的 , 号

跨站请求伪造 Forbidden (403) CSRF verification failed. Request aborted.

找到 settings 中的 MIDDLEWARE 将 csrf 注释掉

You calledthis URL via POST, but the URL doesn't end in a slash and you have APPEND_SLASH set.

模板中提交的 action 数据要和 urls 的 urlpatterns 的 网址名称一样,要么都带 / , 要么都不带 /

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值