Django项目骨架与常见配置修改

命令

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 # 重建项目依赖环境

整体架构

在这里插入图片描述

  1. bbs是项目中的Python包名称,即导入Python包所使用的名称。
  2. _init_.py文件用于标识当前所在的目录是一个Python包。
  3. settings.py是Django项目的配置文件。
  4. urls.py文件用于记录Django项目的URL映射关系。
  5. wsgi.py是WSGI服务器程序的入口文件,用于启动应用程序。
  6. 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/'

默认配置修改

  1. 中文语言环境和时区
LANGUAGE_CODE = 'zh-Hans'
TIME_ZONE = 'Asia/Shanghai'
USE_TZ = False
  1. 创建多个app到同一个文件夹
  • 手动创建
    1)在根目录下新建apps来统一放所有的app
mkdir apps && cd apps
  1. apps中新建一个文件夹,文件夹名字就是想生成app的名字
mkdir demo
  1. 用命令生成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'))
  1. 重载系统用户
    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
  1. 修改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),
]
  1. 注册app
    xadmincrispy_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',
]
  1. 路由配置
  # 富文本编辑器url
    path('ueditor/',include('DjangoUeditor.urls' )),
  1. 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
  1. 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):
  1. 使用UEditorField字段
from DjangoUeditor.models import UEditorField
    goods_desc = UEditorField(verbose_name=u"内容", imagePath="goods/images/", width=1000, height=300,
                              filePath="goods/files/", default='')
  1. 效果
    在这里插入图片描述

django-pure-pagination使用

  1. 安装
pip install django-pure-pagination
  1. 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,
}
  1. 修改源码
    打开paginator.py文件,添加如下代码
    def __iter__(self):
        for i in self.object_list:
            yield i

在这里插入图片描述

  1. 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,
        })
  1. 分页功能
    使用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 自定义错误界面

  1. 修改项目settings.py
DEBUG = False

ALLOWED_HOSTS = ['*']
  1. 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)
  1. 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值