目录
命令
django-admin startproject XX # 创建项目
python manage.py startapp XX # 创建应用
python manage.py shell # shell,进入当前项目环境
python mange.py runserver # 启动内置的服务器运行当前的项目
python manage.py makemigrations # 生成迁移文件(数据表的Schema)
python manage.py migrate # 数据库迁移
python manage.py createsuperuser #创建超级用户(后台登录)
python mange.py test # 运行功能测试和单元测试,功能测试需要自己创建文件
python mange.py test xx # 运行指定目录下的测试
python manage.py collectstatic # 把 static 目录中的文件复制到 STATIC_ROOT 中设置的文件
pip freeze > requirements.txt # 生成环境依赖文件
pip install -r requirements.txt # 重建项目依赖环境
整体架构
- bbs是项目中的Python包名称,即导入Python包所使用的名称。
- _init_.py文件用于标识当前所在的目录是一个Python包。
- settings.py是Django项目的配置文件。
- urls.py文件用于记录Django项目的URL映射关系。
- wsgi.py是WSGI服务器程序的入口文件,用于启动应用程序。
- manage.py是用于管理Django项目的命令行工具。
settings.py文件配置项
# 定义的是bbs所在的完整路径
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# 加密盐,用于对各种需要加密的数据做Hash处理
SECRET_KEY = 'y(ejirhf&()-7=n3*+3v7qe6!o0z2xky2b!g6b7j89v_e1)&=b'
# 开发时设为True,暴露更多信息
DEBUG = True
# 用于配置可以访问当前站点的域名,当DEBUG配置为False时,它是一个必填项,设置ALLOWED_HOSTS=['*']允许所有的域名访问
ALLOWED_HOSTS = []
# 当前项目需要加载的App包路径列表
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
# 项目中需要加载的中间件列表配置
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
# 当前项目的根URL配置,是Django路由系统的入口点
ROOT_URLCONF = 'bbs.urls'
# 项目的模板配置
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
# 内置服务器
WSGI_APPLICATION = 'bbs.wsgi.application'
# 数据库配置
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
# 一些支持插拔的密码验证器,避免直接通过用户的弱密码配置申请
AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
},
]
# 项目的语言环境和时区
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'
# 国际化和本地化
USE_I18N = True
USE_L10N = True
# 标识对于时区的处理,如果设置为True,不论TIME_ZONE设置的是什么,存储到数据库中的时间都是UTC时间
USE_TZ = True
# 静态资源的存放位置
STATIC_URL = '/static/'
默认配置修改
- 中文语言环境和时区
LANGUAGE_CODE = 'zh-Hans'
TIME_ZONE = 'Asia/Shanghai'
USE_TZ = False
- 创建多个app到同一个文件夹
- 手动创建
1)在根目录下新建apps
来统一放所有的app
mkdir apps && cd apps
- 在
apps
中新建一个文件夹,文件夹名字就是想生成app
的名字
mkdir demo
- 用命令生成
demo
django-admin startapp demo demo
# 或者
python manage.py startapp demo apps/demo
- pycharm拖拽
在pycharm
中,直接将已经生成的app
拖到apps
中,这时会弹出对话框提示,取消勾选Search for references
,然后右键apps
文件夹——mark directory as
——sources root
最后,不要忘记在settings.py
中添加路径
sys.path.insert(0, os.path.join(BASE_DIR, 'apps'))
- 重载系统用户
settings中配置
# 重载系统的用户,让UserProfile生效
AUTH_USER_MODEL = 'users.UserProfile'
在 user 应用中自定义 UserProfile 模型
from datetime import datetime
from django.db import models
from django.contrib.auth.models import AbstractUser
class UserProfile(AbstractUser):
""""用户信息"""
GENDER_CHOICES = (
("male", u"男"),
("female", u"女")
)
# 用户用手机注册,姓名,生日和邮箱可以为空
name = models.CharField("姓名", max_length=30, null=True, blank=True)
birthday = models.DateField("出生年月", null=True, blank=True)
gender = models.CharField("性别", max_length=6, choices=GENDER_CHOICES, default="female")
mobile = models.CharField("电话", max_length=11)
email = models.EmailField("邮箱", max_length=100, null=True, blank=True)
class Meta:
verbose_name = "用户信息"
verbose_name_plural = verbose_name
def __str__(self):
return self.username
- 修改app名字,后台显示为中文
修改app/apps.py
文件,这里是 users app
from django.apps import AppConfig
class UsersConfig(AppConfig):
name = 'users'
#app名字后台显示中文
verbose_name = "用户管理"
再在__init__.py
中修改默认配置
default_app_config = 'users.apps.UsersConfig'
xadmin 3 使用
1)下载
git clone git@gitee.com:TomatoChewgum/xadmin_django3.x.git
cd xadmin_django3/
git branch -a
git checkout remotes/origin/django3
2)整合
在自己项目新建 extra_apps
文件夹,把源码xadmin文件夹放到extra_apps
文件夹下面。
把extra_apps右键mark为Source Root并在settings中加入
sys.path.insert(0,os.path.join(BASE_DIR, 'extra_apps'))
3)配置路由
把项目依赖的admin改成xadmin
# urls.py
from django.urls import path
import xadmin
urlpatterns = [
path('xadmin/', xadmin.site.urls),
]
- 注册app
将xadmin
和crispy_forms
注册到settings.py的INSTALLED_APPS中
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'xadmin',
'crispy_forms',
]
5)安装包
pip install -r requirements.txt
#或者
conda install --yes --file requirements.txt
6)使用
迁移数据库后
python manage.py makemigrations
python manage.py migrate
创建管理员用户python manage.py createsuperuser
,运行python manage.py runserver
,访问地址http://127.0.0.1:8000/xadmin
,就可以看到后台记录了。
富文本编辑器Ueditor使用
1.下载 https://github.com/twz915/DjangoUeditor3/,解压后放到extra_apps
目录下面
2. 注册app
INSTALLED_APPS = [
'DjangoUeditor',
]
- 路由配置
# 富文本编辑器url
path('ueditor/',include('DjangoUeditor.urls' )),
- Django3.0.3移除了six,urllib也独立了,修改它们的引入方式
- 将DjangoUEditor目录下的
views.py
文件中的
from django.utils.six.moves.urllib.request import urlopen
from django.utils.six.moves.urllib.parse import urljoin
改成
from six.moves.urllib.request import urlopen
from six.moves.urllib.parse import urljoin
- 将DjangoUEditor目录下的
widgets.py
文件中的
from django.utils.six import string_types
改成
from six import string_types
- 将DjangoUEditor目录下的
commands.py
文件中的
from django.utils.six.moves.urllib.parse import urljoin
改成
from urllib.parse import urljoin
- xadmin 集成 UEditor
- 在 xadmin/plugs 目录下新建ueditor.py文件,代码如下
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import xadmin
from xadmin.views import BaseAdminPlugin, CreateAdminView, ModelFormAdminView, UpdateAdminView
from DjangoUeditor.models import UEditorField
from DjangoUeditor.widgets import UEditorWidget
from django.conf import settings
class XadminUEditorWidget(UEditorWidget):
def __init__(self, **kwargs):
self.ueditor_options = kwargs
self.Media.js = None
super(XadminUEditorWidget, self).__init__(kwargs)
class UeditorPlugin(BaseAdminPlugin):
def get_field_style(self, attrs, db_field, style, **kwargs):
if style == 'ueditor':
if isinstance(db_field, UEditorField):
widget = db_field.formfield().widget
param = {}
param.update(widget.ueditor_settings)
param.update(widget.attrs)
return {'widget': XadminUEditorWidget(**param)}
return attrs
def block_extrahead(self, context, nodes):
js = '<script type="text/javascript" src="%s">;</script>;' % (
settings.STATIC_URL + "ueditor/ueditor.config.js") # 自己的静态目录
js += '<script type="text/javascript" src="%s">;</script>;' % (
settings.STATIC_URL + "ueditor/ueditor.all.min.js") # 自己的静态目录
nodes.append(js)
xadmin.site.register_plugin(UeditorPlugin, UpdateAdminView)
xadmin.site.register_plugin(UeditorPlugin, CreateAdminView)
- 在 xadmin/plugs/_init_.py里面添加ueditor插件
PLUGINS = (
'ueditor',
)
- xadmin 集成ueditor 会出现render错误 找到UEditor/widgets.py,修改如下代码
def render(self, name, value, attrs=None):
# 修改为
def render(self, name, value, attrs=None, renderer=None):
- 使用UEditorField字段
from DjangoUeditor.models import UEditorField
goods_desc = UEditorField(verbose_name=u"内容", imagePath="goods/images/", width=1000, height=300,
filePath="goods/files/", default='')
- 效果
django-pure-pagination使用
- 安装
pip install django-pure-pagination
- settings.py 配置
#注册pure_pagination
INSTALLED_APPS = [
.......
'pure_pagination',
]
#追加pure_pagination配置代码
PAGINATION_SETTINGS={
'PAGE_RANGE_DISPLAYED':10, # 主分页页面显示几个
'MARGIN_PAGES_DISPLAYED':2, #省略号前面显示几个
'SHOW_FIRST_PAGE_WHEN_INVALID':True,
}
- 修改源码
打开paginator.py文件,添加如下代码
def __iter__(self):
for i in self.object_list:
yield i
- views中使用方法
class OrgView(View):
"""课程机构"""
def get(self, request):
all_orgs = CourseOrg.objects.all()
org_nums = all_orgs.count()
all_citys = CityDict.objects.all()
# 对课程机构进行分页
# 尝试获取前台get请求传递过来的page参数
# 如果是不合法的配置参数默认返回第一页
try:
page = request.GET.get('page', 1)
except PageNotAnInteger:
page = 1
# 从all_org中取五个出来,每页显示5个
p = Paginator(all_orgs, 5, request=request)
orgs = p.page(page)
return render(request, "./org/org-list.html", {
"all_orgs": orgs,
"all_citys": all_citys,
"org_nums": org_nums,
})
- 分页功能
使用object_list
分页
<div class="pageturn">
<ul class="pagelist">
{% if all_orgs.has_previous %}
<li class="long"><a href="?{{ all_orgs.previous_page_number.querystring }}">上一页</a></li>
{% endif %}
{% for page in all_orgs.pages %}
{% if page %}
{% ifequal page all_orgs.number %}
<li class="active"><a href="?{{ page.querystring }}">{{ page }}</a></li>
{% else %}
<li><a href="?{{ page.querystring }}" class="page">{{ page }}</a></li>
{% endifequal %}
{% else %}
<li class="none"><a href="">...</a></li>
{% endif %}
{% endfor %}
{% if all_orgs.has_next %}
<li class="long"><a href="?{{ all_orgs.next_page_number.querystring }}">下一页</a></li>
{% endif %}
</ul>
</div>
Django 3.0.8 自定义错误界面
- 修改项目settings.py
DEBUG = False
ALLOWED_HOSTS = ['*']
- views.py添加内容
from django.shortcuts import render
def bad_request(request, exception, template_name='400.html'):
return render(request, template_name)
def permission_denied(request, exception, template_name='403.html'):
return render(request, template_name)
def page_not_found(request, exception, template_name='404.html'):
return render(request, template_name)
# 注意这里没有 exception 参数
def server_error(request, template_name='500.html'):
return render(request, template_name)
- urls.py 添加内容
handler400 = views.bad_request
handler403 = views.permission_denied
handler404 = views.page_not_found
handler500 = views.server_error
特别注意,server_error
没有 exception
参数
Django 电子书
https://www.aliyundrive.com/s/F6YManamqyG