Django学习之路


Django搭建


安装Django

pip install Django==3.2.6 #方法一 先确保安装pip,再进行一下操作

sudo apt install python3-django #方法二

查看是否安装成功

>>> import django
>>> django.get_version()

创建Django工程

  1. 使用django-admin创建一个python web项目。
 django-admin startproject xxx
  1. 创建子应用
python manage.py startapp 子应用名称   #manage.py是创建工程时自动生成的管理文件

3.子应用目录说明

  • admin.py 文件跟网站的后台管理站点配置相关。
  • apps.py 文件用于配置当前子应用的相关信息。
  • migrations 目录用于存放数据库迁移历史文件。
  • models.py 文件用户保存数据库模型类。
  • tests.py 文件用于开发测试用例,编写单元测试。
  • views.py 文件用于编写Web应用视图。
  1. 启动Django 自带的webserver
cd mydodo_web // 进入我们的工程目录下
python manage.py runserver //启动Django 自带的webserver

会提示 server已经成功启动了,在浏览器中访问http://127.0.0.1:8000应该就会看到显示有“It worded!”的Django的欢迎页面了。

Django import / export实现数据库导入导出

使用django-import-export库,导入导出数据,支持csv、xls、json、html等格式

官网:http://django-import-export.readthedocs.io/en/latest/installation.html

  1. 安装django-import-export
pip install django-import-export
  1. 配置settings.py
INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    
    'import_export',
)
  1. 将所有STATICFILES_DIRS中的所有文件夹中的文件及各APP中static中的文件都复制到 静态文件根目录下:STATIC_ROOT
python manage.py collectstatic
  1. models.py 建立model
class Medical(models.Model):
    # Field name made lowercase.
    item_no = models.AutoField(db_column='Item_no', primary_key=True)
    # Field name made lowercase.
    check_date = models.DateField(
        db_column='Check_date', blank=True, null=True)
    # Field name made lowercase.
    hospital = models.CharField(db_column='Hospital', max_length=32)
    # Field name made lowercase.
    item_cn = models.CharField(db_column='Item_cn', max_length=32)
    # Field name made lowercase.
    item_en = models.CharField(
        db_column='Item_en', max_length=32, blank=True, null=True)
    # Field name made lowercase.
    check_result = models.FloatField(
        db_column='Check_result', blank=True, null=True)
    # Field name made lowercase.
    unit = models.CharField(
        db_column='Unit', max_length=32, blank=True, null=True)
    # Field name made lowercase.
    reference = models.CharField(
        db_column='Reference', max_length=32, blank=True, null=True)
    # Field name made lowercase.
    normal = models.IntegerField(db_column='Normal', blank=True, null=True)

    
    class Meta:
        managed = False
        db_table = 'medical'
  1. 在admin.py 创建Resource、对应的Admin
    注意:在admin.py里使用ImportExportModelAdmin,而不是ModelAdmin

class MedicalResource(resources.ModelResource):

    class Meta:
        model = models.Medical
        fields = ('check_date', "hospital", "item_cn", "item_en",
                  "check_result", "unit", "reference", "normal")
        export_order = ('check_date', "hospital", "item_cn",
                        "item_en", "check_result", "unit", "reference", "normal")

class MedicalAdmin(ImportExportModelAdmin):
    list_display = ('check_date', "hospital", "item_cn", "item_en", "check_result", "unit", "reference",
                    "normal")  # 重写属性list_display,来设置展示的表字段
    # 重写属性search_fields,把表字段name的值当做搜索条件
    search_fields = ('check_date', "hospital", "item_cn", "item_en", "normal")
    list_filter = ('check_date', "hospital", "item_cn", "item_en", "normal")

    date_hierarchy = 'check_date'
    resource_class = MedicalResource

数据库操作

增加数据

#方法1:创建新对象
   #类名.objects.create(字段=值,字段=值)
    Model_class.objects.create(column1="xxx",
                    column2="yyy")
#方法2:
m = model_name(column1="xxx",column2="yyy")
m.save()

删除数据

    #类名.objects.filter(字段=值).delete()
    Model_class.objects.filter(column1="xxx").delete()

查询数据

  • 查询单条数据
#类名.objects.get(字段=值)
sql = Model_class.objects.get(column1="xxx")#在查不到不到会报错
 
password = sql.row1
  • 查询多条数据
#类名.objects.filter(字段=值)
sql=Model_class.objects.filter(column1=xxx,column2=yyy)

模型序列化

from django.core import serializers
     
    modle_rest=Model_class.objects.filter(column1=xxx,column2=yyy)
  
    json_data = serializers.serialize('json', modle_rest)

Django默认不支持https

1)以python manage.py runserver启动应用,是不支持https的,报错如下错误:
You’re accessing the development server over HTTPS, but it only supports HTTP

2)settings.py中设置SECURE_SSL_REDIRECT = True此时,http请求自动跳转到https,http此时django能正确访问。如果直接请求HTTPS时会报错如下错误:
You’re accessing the development server over HTTPS, but it only supports HTTP.

Django安装sslserver以支持https

  1. 安装sslserver插件
pip install django-sslserver
  1. 在settings.py中添加配置
INSTALLED_APPS = (
    ...
    "sslserver",
    ...
)
  1. 自带证书启动django应用
python manage.py runsslserver
  1. 指定证书启动django应用
python manage.py runsslserver --certificate /path/to/certificate.crt --key /path/to/key.key 0.0.0.0:8000

模块

  • import_export
  • django-sslserver
  • django-werkzeug-debugger-runserver
  • django_extensions
  • flask
  • pymysql

命令

Django migrate

1. 初始化app models 表:python manage.py makemigrations (所有模型)
2. 初始化app 某个模块:python manage.py makemigrations app_name
3. 迁移升级表:python manage.py migrate
4. 迁移某个app: python manage.py migrate app_name
5. 查看迁移文件的执行状态,可以用showmigrations命令查看:python manage.py showmigrations admin
6. 指定迁移表变化名字:python manage.py makemigrations user --name "team_region"

静态文件

  • 创建static文件
  • 在settings.py文件中添加STATIC_URL = 'static/'

操作MySQL

  1. 在Django的settings.py文件中设置如下:
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',   # 数据库引擎
        'NAME': 'xxx',  # 数据库名,先前创建的
        'USER': 'root',     # 用户名,可以自己创建用户
        'PASSWORD': '****',  # 密码
        'HOST': '127.0.0.1',  # mysql服务所在的主机ip
        'PORT': '3306',         # mysql服务端口
    }
}
  1. 运行python manage.py createsuperuser 命令来创建一个管理员账户
  2. 在admin.py中将Model注册到管理后台

定时任务

django-crontab

  1. 安装django-crontab插件
pip3 install django-crontab

'''

  1. 在settings.pyINSTALLED_APPS 注册APP
INSTALLED_APPS = [

    ...

    'django_crontab'

]
  1. django_crontab格式

*    *    *    *    * :分别表示 分(0-59)、时(0-23)、天(1 - 31)、月(1 - 12) 、周(星期中星期几 (0 - 7) (0 7 均为周天))

crontab范例:

每五分钟执行    */5 * * * *

每小时执行     0 * * * *

每天执行       0 0 * * *

每周一执行       0 0 * * 1

每月执行       0 0 1 * *

每天23点执行   0 23 * * *

'''

CRONJOBS = [

    ('*/1 * * * *', 'base.crontabs.confdict_handle', ' >> /tmp/logs/confdict_handle.log'), # 注意:/tmp/base_api 目录要手动创建

]

继承

  1. html
    子模板只能修改父模板中定义的block
    父模板
{% block par_block_name %}
...
{% endblock %}

子模板

<-- 声明继承的父模板 -->
{% block par_block_name %}
...
{% endblock %}

中间件

  1. 在manage.py同级目录下新建中间件目录(如:middleware)
  2. 在settings.py MIDDLEWARE 中注册中间件

问题报错

django ModuleNotFoundError: No module named 'xxx.urls'

解决方法:查看urls.py文件是否存在,或者路径是否正确

CSRF验证失败. 请求被中断

解决方法:待解决

错误:MultipleObjectsReturned

解决方法:
使用过滤器

from django.core.exceptions import MultipleObjectsReturned
...
try:
    model_name.objects.get(column_name='xxx')
except MultipleObjectsReturned:
    model_name.objects.filter(column_name='xxx').first()

html 引用css、js等静态文件加载不成功

解决方法:

  1. 在setting.py中添加以下代码:
STATIC_ROOT = os.path.join(BASE_DIR, 'static/')
STATICFILES_DIRS = (
    ('js', os.path.join(STATIC_ROOT, 'js')),
    ('css', os.path.join(STATIC_ROOT, 'css')),
    ('img', os.path.join(STATIC_ROOT, 'img')),
)
  1. 引用时按照以下格式:
<link rel="stylesheet" type="text/css" href="static/css/mydodo.css">
<script type="text/javascript" src="static/js/mydodo.js"></script>
  1. 若修改了css等不生效的话,执行:
python manage.py collectstatic
posted @ 2021-11-02 21:30  D·Kingson.Mo  阅读(235)  评论(0)    收藏  举报