Python学习笔记Day18 - Django
快速开发组件
BootStrap (***最精美,模板多nifty)
- css
- js
学习 BootStrap 规则
一、响应式
@media (min-width:900px){
.c2{}
}
二、图标、字体
@font-face 指定图标字体文件
使用时使用代号
三、基本使用
导入js
导入bootstrap
css:{
color:red !important; #加!important表示不管先后顺序,一定会应用
}
bxslider轮播图,引用它的css和js,
========> 偏于后台管理
jQueryUI (*略推荐)
- css
- js
学习 jQueryUI 规则
EasyUI
- css
- js
在官网下easyUI包,查demo,复制源码,更改css,js链接
easyUI的源码和html代码不一致,不方便修改,不推荐
WEB框架
本质是socket
MVC:对文件夹分类
Model View Controller
数据库 模板文件 业务处理(函数)
MTV:
Model Template View
数据库 模板文件 业务处理
MVC、MTV,只是文件夹命名不同
Django
==用python开发web最齐全的框架=
基于MTV框架
http://www.cnblogs.com/wupeiqi/articles/5237704.html
1. 创建Django工程
-
执行终端命令
django-admin startproject 【工程名称】
也可从Pycharm等IDE创建,不用重复此步骤,本质上都是自动执行上述命令
-
其他常用命令:
python manage.py runserver 0.0.0.0 python manage.py startapp appname python manage.py syncdb python manage.py makemigrations python manage.py migrate python manage.py createsuperuser
-
程序目录:
【工程文件夹】 - 【同名子文件夹】 # 对整个程序进行配置 - init - settings # 配置文件 - wsgi # 遵循WSIG规范,创建socket,uwsgi + nginx - url # URL对应关系 def hello(request): return HttpResponse('<div>hello</div>') urlpatterns = [ path('s1/',hello) ] - manage.py # 管理Django程序:ORM对象 - python manage.py - python manage.py startapp xx - python manage.py makemigrations - python manage.py migrate
2. 运行Django功能
python manage.py runserver 127.0.0.1:8001
3. 创建app文件夹
-
配置文件夹
cd 工程名 python manage.py startapp xxxx....
-
app目录:
migrations 数据修改表结构,每次表结构修改都会记录在一个文件中 admin Django为我们提供的后台管理功能(包括登录、权限管理、分组、搜索) apps 配置当前app models ORM,写指定的类 通过命令可以创建数据库结构 tests 单元测试 views *** 业务代码
4. 配置模板的路径
放置html,一般已自动创建 /./settings
TEMPLATES = [{
'DIRS': [os.path.join(BASE_DIR, 'templates')],
},]
5. 创建并配置静态目录
-
创建/static,放置css,js,image等静态文件
/./settings STATICFILES_DIRS = ( os.path.join(BASE_DIR, 'static'), # 不加逗号会报错 )
-
在html中导入css,js
<link rel="stylesheet" href="/static/commons.css" />
6. 跨站请求伪造csrf禁用 (正式项目不需此步,但要在html中声明csrf_token)
/./settings
middlerware # 注释 csrf
# 'django.middleware.csrf.CsrfViewMiddleware',
7. 定义路由规则url
/./url.py
1. 要在url里导入app
2. path('home/',views.home),
- url里可不加/,但要与引用处保持一致。
- 建议加上,访问时没有则自动加/
-
Django生命周期:
用户请求 ->> 路由 ->> 视图函数 ->> templates(html)、static(js,css) url.py app.views.py
8. 定义视图函数views
/app/views.py
def func(request):
request.method GET / POST (大写)
========== GET 获取数据===========
http://127.0.0.1:8009/home?nid=123&name=alex
request.GET.get('',None) # 获取请求发来的数据,没有则返回none
========== POST 提交数据==========
request.POST 包含用户提交的数据字典,以name字段为key
request.POST.get('')
======== 返回数据 ========
return HttpResponse('<div>hello</div>') # 直接返回字符串,可解析成页面
return render(request, "HTML模板的路径",{'形参': 实参}) # 获取html文件返回
return redirect('只能填URL') # 重定向
- 也可填本地url:'/home' 前面的/代表本地的url前缀
9. 模板渲染
-
Django中特殊的模板语言
-
{{ 变量名 }}
视图函数返回数据时将{{}}替换为相应的值 return render(request, "index.html", { 'current_user': "alex", 'user_list': ['alex','eric'] 'user_dict': {'k1': 'v1', 'k2': 'v2'} }) <html> <body> <div>{{current_user}}</div> </body> </html>
-
For循环
{% for row in user_list %} <li>{{ row }}</li> {% endfor %} - 获取key {% for row in k2.keys %} - 获取value {% for row in k2.values %} - 获取key和value {% for k,v in k2.items %} - for循环里获取当前循环次数 forloop.counter 索引,从 1 开始算 forloop.counter0 索引,从 0 开始算 forloop.revcounter 索引,从最大长度到 1 forloop.revcounter0 索引,从最大长度到 0 forloop.first 当遍历的元素为第一项时为真 forloop.last 当遍历的元素为最后一项时为真 forloop.parentloop.xxx 用在嵌套的 for 循环中,获取上层循环的 forloop
-
用 "索引" 取列表(0)或字典(key)里的值
<a> {{ user_list.0 }} </a> <a> {{ user_dict.k1 }} </a>
-
if条件判断
{% if age %} <a>有年龄</a> {% if age > 16 %} <a>老男人</a> {% elif age < 3 %} ... {% else %} <a>小鲜肉</a> {% endif %} {% else %} <a>无年龄</a> {% endif %} ==, !=, >=, <=, >, < and, or, not, in, not in {%if value is None %}
-
获取当前用户:
{{ request.user }}
-
如果登陆就显示内容,不登陆就不显示内容:
{% if request.user.is_authenticated %} {{ request.user.username }},您好! {% else %} 请登陆,这里放登陆链接 {% endif %}
-
获取当前网址:
{{ request.path }}
-
获取当前 GET 参数:
{{ request.GET.urlencode }} # keywords=131;time_filter=True
-
获取referer
request.META['HTTP_REFERER']
作业
XXXX管理:
SQLAlchemy
-
主机管理表(8列):
IP 端口 业务线 ...
-
用户表:
用户名 密码
-
功能:
1、登录 2、主机管理页面 - 查看所有的主机信息(4列) - 增加主机信息(8列) ** 模态对话框 3、查看详细 url: "detail" -> detail def detail(reqeust): nid = request.GET.get("nid") v = select * from tb where id = nid ... 4、删除 del_host -> delete_host def delete_host(request): nid = request.POST.get('nid') delete from tb where id = nid return redirect('/home')
博客
-
KindEditor
- beautifulsoup4对标签进行过滤
- 单例模式
-
事务操作
- from django.db import transaction
-
筛选条件
- 利用数据库内置函数实现筛选
作业:
- 示例
- 评论和点赞
pip3 install beautifulsoup4
问题
1. table文字不换行
- 给相应td添加 white-space:nowrap; 这个属性是设置文字强制不换行
- 或者在td内添加div标签,默认不换行
2. 设置STATIC_URL, STATICFILES_DIRS, STATIC_ROOT的区别
-
STATIC_URL='/static/'
这个static 是在Django 具体APP下建立的static目录,用来存放静态资源。
-
STATIC_ROOT = os.path.join(BASE_DIR, 'collect_static')
# BASE_DIR 是项目的绝对地址STATIC_ROOT 是在部署静态文件时(pyhtonmanage.pycollectstatic)所有的静态文静聚合的目录,STATIC_ROOT要写成绝对地址
STATIC_ROOT 是在部署的时候才发挥作用,django会把所有的static文件都复制到STATIC_ROOT文件夹下 -
STATICFILES_DIRS=(os.path.join(BASE_DIR, "common_static"),)
# 不加逗号会报错STATICFILES_DIRS 一般用来设置通用的静态资源,对应的目录不放在APP下,而是放在Project下,且非必须.
STATICFILES_DIRS告诉django,首先到STATICFILES_DIRS里面寻找静态文件,其次再到各个app的static文件夹里面找
(注意, django查找静态文件是惰性查找,查找到第一个,就停止查找了)
具体在模板文件中访问的时候,都是统一用:/static/资源名的方式,就可以访问到资源
不论具体的目录是APP下的static,还是project下的common_static, 都可以用/static/资源名的方式访问到。
为增强可移植性,在模板中可以用:STATIC_URL来代替具体的/static/来设置资源路径,但是需要在settings.py中2个地方进行设置,否则会发生取不到资源的错误:
INSTALLED_APPS 中,加入 'django.contrib.staticfiles'
TEMPLATES 中,context_processors中,加入django.template.context_processors.static
模板中调用时:
<img src="{{STATIC_URL}}pic.jpg " />
https://blog.csdn.net/jj546630576/article/details/78606531
3. 在Django中完整地删除一个App
-
删除models.py
无论是删除一个单独的model还是删除整个App,都需要首先删除models.py文件中的模型。
确认没有其他文件引用models.py中的类。
迁移或者删除你的数据库,Django提供了简便的方法方便用户删除某App下的所有数据(Django 1.7)。
python manage.py migrate app1 zero
删除models.py中的数据模型。
-
删除App
再次确认其他App中没有引用此App的文件
删除整个App文件夹
在settings.py的Installed Apps中移除该app。
4. 修改完数据后可直接用redirect刷新页面(属于get方式),比用render再传一次参数要方便
组合搜索
-
利用url传参给views里的kwargs,利用models.XX.filter筛选id
-
将当前kwargs传给模板,获取当前url,达成组合搜索
-
利用simpletag写小模板,将判断代码写在后台.py文件中