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 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...]