SAOMS系统搭建
采用python3.6 + django2.1 + pycharm
- Django采用M(model: 数据存取层) T(template: 业务逻辑层) V(views: 表现层)
初始化项目
1. 首先要确保有pip包管理工具
2. virtualenv: pip install virtualenv, python虚拟环境
3. mkvirtualenv <project_name>创建虚拟环境
4. workon <env_name> 进入虚拟环境
5. pip install xxx 安装依赖包,配置项目环境
6. django-admin startproject <pro_name> 创建项目
7. 进入项目目录, python manage.py help 查看manage.py的功能
8. python manage.py runserver 80 启动项目,默认端口8000
9. 访问 127.0.0.1:80,项目创建成功
创建应用
python manage.py startapp <app_name>
目录结构:
-SAOMS
--app
---migrations
----__init__.py
---__init__.py
---admin.py
---models.py
---views.py
---apps.py
---tests.py
--manage.py
--SAOMS
---settings.py
---wsgi.py
---urls.py
项目settings.py配置
1. INSTALL_APPS添加刚才创建的app
2. STATIC_URL = 'static' 静态资源的起始URL,其static文件只能在app里
3. STATICFILES_DIR = [os.path.join(BASE_DIR, 'public_static'), ] 可选配置属性,
4. STATIC_ROOT = os.path.join(BASE_DIR, 'all_static') 用于生产部署的时候,开发时用不太到
5. 模板路径,tamplates,根目录下放公共的模板,app目录下放各自app独立的模板
'DIRS': [os.path.join(BASE_DIR, 'templates'),
os.path.join(BASE_DIR, 'home/templates'),
os.path.join(BASE_DIR, 'student/templates'), ],
6. 数据库配置
django.db.backends.postgresql/mysql/sqlite3/oracle
default为默认数据库,也可以链接多个数据库
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'name',
'USER': 'root',
'PASSWORD': '****',
'HOST': '127.0.0.1',
'PORT': '3306',
}
'myDJANGO': {
'ENGINE': 'django.db.backends.mysql',
'NAME': <name>,
'USER': 'root',
'PASSWORD': '*****',
'HOST': '127.0.0.1',
'PORT': '3306',
}
7. 中间件,处理request和response对象的钩子,中间件的作用主要使处理用户请求信息,也可以自定义中间件,添加到配置属性即可。
编写URL(统一资源定位符)规则
- 在每个app文件夹中设置独立的静态资源和模板文件夹并添加一个urls.py文件
- 根目录下urls.py
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('home.urls')),
]
- app中的urls.py
from django.urls import path
from . import views
urlpatterns = [
path('', views.index),
]
# app 的views中的代码
from django.http import HttpResponse
def index(request):
return HttpResponse('Hello World')
- 带变量的URL
例如带有日期的url
- url的变量类型又字符类型,整型,slug, uuid,最常用的使字符类型和整型。
path('<year>/<int:month>/<slug:day>', views.mydate)
- 也可以使用正则表达式来规范化数据格式
from django.urls import path, re_path
re_path('(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<day>[0-9]{2}).html', views.mydate)
URL末端使用正则表达式,应在末端加上斜杠或其他字符,否则无法生效。
- 设置参数name,
views.mydate, name='mydate'),
<div>
<a href="/2019/09/10.html">2019 pld achieve</a>
</div>
<a href="{% url 'mydate' 2019 %}">2019 achieve</a>
</div>
- 设置额外参数
1. 除了name之外,还有参数类型是以字典的数据类型传递的只能在视图函数中读取和使用
视图探究
- render, render_to_response, redirect
def index(request):
return render(request, 'template2/index.html', context={'title': '首页'}, status=500)
- render(request, template_name, context = None, content_type = None, status = None, using = None)
- 数据可视化
- 与model实现数据交互,读取并处理后台数据,最后生成HTML页面返回给用户。
# coding=utf-8
from django.db import models
# Create your models here.
class Product(models.Model):
id = models.IntegerField(primary_key=True)
name = models.CharField(max_length=50)
type = models.CharField(max_length=20)
# views.py
from models import Product
def index(request):
type_list = Product.objects.values('type').distinct()
name_list = Product.objects.values('name', 'type')
context = {'title': '首页', 'type_list': type_list, 'name_list': name_list}
return render(request, 'template2/index.html', context=context, status=200)
- 通用视图
TemplateView: 直接返回HTML模板,无法将数据库的数据展示出来
ListView: 将数据库数据传递给HTML模板,通常获取某个表的所有数据
DetailView: 通常获取数据表的单条数据
深入模板
Django模板,Jinja2模板语言(http://docs.jinkan.org/docs/j...)
- 变量和标签
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>{{ title }}</title>
{% load staticfiles %}
<link rel="icon" href="{% static "img/hw.ico" %}">
<script class="lazy" data-src="{% static "js/hw_index.js" %}"></script>
</head>
<body>
<ul>
{% for type in type_list %}
<li>
<h3><a href="#">{{ type.type }}</a></h3>
<p>
{% for name in name_list %}
{% if name.type == type.type %}
<span>{{ name.name }}</span>
{% endif %}
{% endfor %}
</p>
</li>
{% endfor %}
</ul>
</body>
- 常用标签
{% for %}:遍历
{% if %}:条件判断
{% csrf_token %}:生成csrf_token标签,防护跨站请求伪造攻击
{% url 'index' <kwargs> %}:引用路由配置地址
{% with %}:将变量名重新命名
{% load %}:加载导入Django的标签库
{% static %}:读取静态资源的文件内容
{% extends xxx %}:模板继承,xxx为模板文件名
{% block xxx %}:重写父类模板的代码
3.模板继承
{% extends "base.html" %}
{% block body %}
<a href="{% url 'index' target="_blank %}"></a>
{% endblock %}
- 自定义过滤器
{{ variable | filter | lower }}
项目新建user_defined文件夹
----templatetags文件夹
----__init__.py
----myfilter.py
在settings.py中INSTALL_APPS中添加'user_defined'
# myfilter.py
from django import template
# 注册过滤器,声明模板对象
register = template.Library()
#声明并定义过滤器
@register.filter
def myreplace(value, args):
oldValue = args.split(':')[0]
newValue = args.split(':')[1]
return value.replace(oldValue, newValue)
models模块,模型与数据库
[models详细介绍: https://blog.csdn.net/qq_3704...]