| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [View Raw Code] [Original HTTPS Page] |
创建工程
Django 项目启动
进入 Django 项目 manage.py 同级目录
激活虚拟环境
启动项目
python manage.py runserver
python manage.py runserver 9000 : 修改端口
python manage.py runserver 0.0.0.0:9000 : 局域网开放并修改端口
设置 setting.py 中的 ALLOWED_HOST =['*']
目录结构
在主目录下创建 views.py
from django.shortcuts import HttpResponse
def hello(request):
return HttpResponse('hello word')请求流程
基本格式
from django.contrib import admin
from django.urls import path
from .views import *
urlpatterns = {
path('admin/', admin.site.urls),
path('hello/', hello)
}两种格式
Django 中 路由正则匹配
分组匹配
分组命名匹配
在 manage.py 同级下创建 文件夹 templates 存放 HTML 模板
在 setting.py 下进行读取模板配置
TEMPLATES = [
{
...
'DIRS' : [os.path.join(BASE_DIR, 'templates')],
...
}
]建立 HTML 文件
在 views.py 中 返回页面
from django.shortcuts import HttpResponse, render_to_response
def hello(request):
# return HttpResponse('hello word')
return render_to_response('hello.html')变量
语法 : {{ 变量名 }}
变量传参
以 字典形式传参
def index(request):
uer_info = {'name': "张三", 'age': 12}
hobbies = ['篮球', '足球']
return render(request, 'index.html', {
'user_info': user_info,
'hobbies': hobbies,
})以 locals() 集体传参
def index(request): uer_info = {'name': "张三", 'age': 12} hobbies = ['篮球', '足球'] return render(request, 'index.html', locals()) ```
支持类型为 : 字符串、整型、列表、字典、元组
变量为字典可以通过键取值
变量为可迭代对象可以使用索引取值
标签
语法 : {% %}
结构
if 结构
{% if 条件 %}
执行语句
{% elif 条件 %}
执行语句
{% endif %}ifequal 结构
{% ifequal age 19 %}
成年
{% endifequal %} ```for 循环结构
for ... empty 循环
{% for i in arr %} {{ i }} {% empty %} 列表内没有 i {% endfor %} ```
autoescape off 关闭自动转义
{% autoescape on %} {{ url }} {% endautoescape %} {% autoescape off %} {{ url }} {% endautoescape %} ```
过滤器
方法一
在 manage.py 同级目录下创建 static 文件夹, 用来存放静态 JS、CSS、图片等文件
在 setting.py 内配置
STATIC_URL = '/static/'
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static'),
]在 html 文件内加载静态资源
<img src="/static/xxx.png" alt=">"方法二
继承 extends
对于重复的网页去除冗余代码,或者AJAX方便加载
定义父 base 模板后调用
{% extends 'base.html' %}
{% block main %}
{% endblock %}包含 include
将常用的页面内容,导航栏、页尾信息等不变组件单独存储,使用时在使用地方导入
语法
{% include 'navbar.html' %}python manage.py startapp app_name
在 setting.py 文件 INSTALLD_APPS 列表中注册 App
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'blog',
]使用 pycharm 在 New Project --> more setting 内 创建 App
配置 MySQL 数据库
设置数据库配置信息
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'db_name',
'USER': 'user_name',
'PASSWORD': 'user_password',
'HOST': 'HOST_IP',
'PORT': 'mysql_port', # 默认 3306
}
}下载 PyMySQL 模块,在 项目包的 __init__.py 下
import pymysql
pymysql.install_as_PyMySQLdb()排错 : Django 2.2.1 与 PyMySQL 不兼容需要修改源码
生成数据库映射时报错
Traceback (most recent call last):
File "manage.py", line 21, in <module>
main()
File "manage.py", line 17, in main
execute_from_command_line(sys.argv)
File "E:\Anaconda\envs\mydjango\lib\site-packages\django\core\management\__init__.py", line 381, in execute_from_command_line
utility.execute()
File "E:\Anaconda\envs\mydjango\lib\site-packages\django\core\management\__init__.py", line 375, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "E:\Anaconda\envs\mydjango\lib\site-packages\django\core\management\base.py", line 323, in run_from_argv
self.execute(*args, **cmd_options)
File "E:\Anaconda\envs\mydjango\lib\site-packages\django\core\management\base.py", line 364, in execute
output = self.handle(*args, **options)
File "E:\Anaconda\envs\mydjango\lib\site-packages\django\core\management\base.py", line 83, in wrapped
res = handle_func(*args, **kwargs)
File "E:\Anaconda\envs\mydjango\lib\site-packages\django\core\management\commands\makemigrations.py", line 101, in handle
loader.check_consistent_history(connection)
File "E:\Anaconda\envs\mydjango\lib\site-packages\django\db\migrations\loader.py", line 283, in check_consistent_history
applied = recorder.applied_migrations()
File "E:\Anaconda\envs\mydjango\lib\site-packages\django\db\migrations\recorder.py", line 73, in applied_migrations
if self.has_table():
File "E:\Anaconda\envs\mydjango\lib\site-packages\django\db\migrations\recorder.py", line 56, in has_table
return self.Migration._meta.db_table in self.connection.introspection.table_names(self.connection.cursor())
File "E:\Anaconda\envs\mydjango\lib\site-packages\django\db\backends\base\base.py", line 256, in cursor
return self._cursor()
File "E:\Anaconda\envs\mydjango\lib\site-packages\django\db\backends\base\base.py", line 233, in _cursor
self.ensure_connection()
File "E:\Anaconda\envs\mydjango\lib\site-packages\django\db\backends\base\base.py", line 217, in ensure_connection
self.connect()
File "E:\Anaconda\envs\mydjango\lib\site-packages\django\db\backends\base\base.py", line 197, in connect
self.init_connection_state()
File "E:\Anaconda\envs\mydjango\lib\site-packages\django\db\backends\mysql\base.py", line 231, in init_connection_state
if self.features.is_sql_auto_is_null_enabled:
File "E:\Anaconda\envs\mydjango\lib\site-packages\django\utils\functional.py", line 80, in __get__
res = instance.__dict__[self.name] = self.func(instance)
File "E:\Anaconda\envs\mydjango\lib\site-packages\django\db\backends\mysql\features.py", line 82, in is_sql_auto_is_null_enabled
cursor.execute('SELECT @@SQL_AUTO_IS_NULL')
File "E:\Anaconda\envs\mydjango\lib\site-packages\django\db\backends\utils.py", line 103, in execute
sql = self.db.ops.last_executed_query(self.cursor, sql, params)
File "E:\Anaconda\envs\mydjango\lib\site-packages\django\db\backends\mysql\operations.py", line 146, in last_executed_query
query = query.decode(errors='replace')
AttributeError: 'str' object has no attribute 'decode'
修改源码: File "E:\Anaconda\envs\mydjango\lib\site-packages\django\db\backends\mysql\operations.py", line 146, in last_executed_queryquery = query.decode(errors='replace')原为 decode ,python3 无此方法,改为 encode
def last_executed_query(self, cursor, sql, params):
# With MySQLdb, cursor objects have an (undocumented) "_executed"
# attribute where the exact query sent to the database is saved.
# See MySQLdb/cursors.py in the source distribution.
query = getattr(cursor, '_executed', None)
if query is not None:
query = query.encode(errors='replace') # 原为 decode ,python3 无此方法,改为 encode
return query继续进行数据库检查、生成映射、同步至数据库
配置 sqlite3 数据库
配置
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}数据迁移 (添加新的数据库表时)
Django 模型常用字段
| 字段名称 | 字段描述 |
|---|---|
| models.CharField(max_length=32) | 字符串类型,必须设置 max_length |
| models.IntergerField() | 整数类型 |
| models.FloatField() | 小数类型 |
| models.TextField() | 文本类型 |
| models.EmailField() | 邮件格式的字符串 |
| models.DateField() | 日期格式 (年月日) |
| models.DateTimeField() | 时间格式 (年月日时分秒) |
| models.FileField(upload_to=file_dir) | 文件类型, 特殊类型,可以保存文件路径同时自动上传文件,必须设置 upload_to 上传到媒体路径下的位置 |
| models.ImageField(upload_to=img_dir) | 图片类型, 特殊类型 (需要提前配置),可以保存文件路径同时自动上传文件,必须设置 upload_to 上传到媒体路径下的位置 |
| 电话类型 | 必须是美国座机格式的电话号 |
配置 ImageField 保存图片
安装 pillow 模块 : pip install pillow
setting.py 配置媒体文件
MEDIA_URL = "/media/"
MEDIA_ROOT = os.path.join(BASE_DIR, 'static')Django 数据库常用的字段参数
| 参数名称 | 参数描述 |
|---|---|
| verbose_name | 别名,在后台可以使用 |
| default | 默认值 |
| unique | 不可重复 |
| blank | 可以为空,常用于字符串 |
| null | 可以为 null 常用于数字和时间 |
| max_length | 字符串长度范围 |
| upload_to | 文件上传地址 |
| Auto_now | 默认当前时间 |
Django ORM 总结
| Back | FazBrowse Home | New Git URL |