# MyDjangoShop **Repository Path**: wzxnb/MyDjangoShop ## Basic Information - **Project Name**: MyDjangoShop - **Description**: 📝记录用Django完成一个后台的管理 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-01-17 - **Last Updated**: 2021-01-20 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Django笔记 ## 1. 环境配置 ### 1.1 命令行搭建Django环境 #### 1.1.1 创建Django项目 ```python django-admin startproject ``` #### 1.1.2 创建App ```python django-admin startapp ``` ### 1.2 Pycharm搭建Django环境 #### 1.2.1 创建Django项目和App ![image-20210113163221377](./pic/create_project.png) ## 2. 主项目文件介绍及配置 ### 2.1 settings.py * 配置主机访问地址和App管理 ![settings_about](./pic/settings_about.png) * 设置语言和时区 ![image-20210113163839971](./pic/settings_about2.png) ### 2.2 urls.py #### 2.2.1 主路由 > 主路由中可直接处理服务器请求, 建议每个App都设置一个子路由, 当使用到子路由的时候需要在主路由中使用`include()`方法来加入到子路由中, 加入子路由时可设置路由前缀`path("user", include("App.urls"))`其中的`user`就是路由前缀, 设置路由前缀方便开发人员辨识. ![image-20210113164442363](./pic/urls_about.png) #### 2.2.2 子路由 > 子路由只处理本App内部的事务, 多个视图可对应一个视图函数, 处理方式是`FCFS` ![image-20210114232618373](./pic/urls_about2.png) #### 2.2.3 路由的参数 > `path('home/', views.home, name='home')`共有三个参数 > > * 路由对象 > * 路由的视图处理函数 > * 路由名称(使用反向路由时会用到) ### 2.3 views.py #### 2.3.1 视图介绍 > 视图处理文件, 路由中标记的所有函数都来自`views`中 > > 视图函数的第一个参数就是请求对象(`HttpRequest`), 由`django`传递 ![views_about](./pic/views_about.png) #### 2.3.2 视图函数 #### 2.3.3 `CSRF`安全性检查 > 在表单中必须要加上`{% csrf_token %}`才可以完成提交 ## 3. 模板 > 围绕templates ### 3.1 模板文件夹存放位置 * 根目录下templates * App内templates > 建议使用根目录下的templates, 每个App对应一个文件夹, 共享的页面如404这些可以共用 ### 3.2 模板渲染 #### 3.2.1 render ```python def render(request, template_name, context=None, content_type=None, status=None, using=None): """ Return a HttpResponse whose content is filled with the result of calling django.template.loader.render_to_string() with the passed arguments. """ content = loader.render_to_string(template_name, context, request, using=using) return HttpResponse(content, content_type, status) ``` #### 3.2.2 loader ```python obj = loader.get_template("index.html") res = obj.render({"name":"hello", "password":"hhh"}) return HttpResponse(res) ``` ### 3.3 模板语法 1. 变量 2. 过滤器 3. 标签 变量只能传Python内置对象 过滤器官网可查, 可自定义 if标签不能使用()for等等 ## 4. 模型 ### 4.1 连接数据库 #### 4.1.1 默认选择sqlite3单标文件 > 只适合演示, 真实项目需要使用安全性更高的数据库 #### 4.1.2 使用mysql > Mac安装mysqlclient途中遭遇了很多不可预知的错误❌, wdnmd * 在`settings`中更改数据库 ```python # Database # https://docs.djangoproject.com/en/3.1/ref/settings/#databases DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'test', 'HOST': '127.0.0.1', 'USER': 'root', 'PASSWORD': 'wondering', 'PORT': '3306' } } ``` #### 4.1.3 安装mysqlclient提示错误 > 提示`OSError: mysql_config not found`错误 * 解决方法 > 在终端输入`PATH="$PATH":/usr/local/mysql/bin/` > > 之后就可以正常安装 mysqlclient #### 4.1.4 运行项目报错 > 提示 `NameError: name '_mysql' is not defined` > > 原因是Mysqldb 不兼容 python3.5 以后的版本 * 解决方法 > ​ 在主项目文件的`__init__.py`文件头加上 > > ```python > import pymysql > pymysql.install_as_MySQLdb() > ``` ### 4.2 创建数据库 #### 4.2.1 实例化数据库对象 > 在`App`中的Models层中创建一个类对象, 字段对应着数据库中的字段 ```python class User(models.Model): # 字段名不能是Python关键字 uid = models.AutoField(primary_key=True, db_column='uid') # CharField必须要指定长度 username = models.CharField(max_length=30) password = models.CharField(max_length=30) registerTime = models.DateTimeField(auto_now_add=True) class Meta: # 元数据, 保存模型本身的信息 # 默认表名: 应用名_模型名 db_table = 'user' ``` * 若数据库中存在这样的`user`表则不需要再创建, 可以直接进行操作 * 若数据库中没有这样的表需要手动创建一个或者采用`Django`自带的迁移 * `python manage.py makemigrations` * `python manage.py migrate` ### 4.3 操作数据库 > https://docs.djangoproject.com/zh-hans/3.1/ref/models/querysets/ #### 4.3.1 增 * `save()`增加单个对象 ```python user = User(username='Jack', password='123') user.save() ``` * `create()`增加单个对象 ```python User.objects.create() ``` * `User.objects.bulk_create()`增加多个对象 ```python users = [] first = "赵钱孙李周吴郑王冯陈褚卫蒋沈韩杨朱秦尤许何吕施张孔曹严华金魏陶姜戚谢邹喻柏水窦章云苏潘葛奚范彭郎鲁韦昌马苗凤花方俞任袁柳" last = ["雨莺","筱萱","刁丽","莺拓","刁洁",] for _ in range(1000): username = list(first)[randint(0, len(first) - 1)] + list(last)[randint(0, len(last) - 1)] password = ''.join(sample(string.ascii_letters + string.digits, 10)) users.append(User(username=username, password=password)) User.objects.bulk_create(users) return HttpResponse("数据增加成功!") ``` #### 4.3.2 删 * `delete()`删除单个对象 ```python user = User.objects.get(pk=1) user.delete() ``` * `delete()`删除多个对象 ```python blogs = Blog.objects.all() blogs.delete() ``` #### 4.3.3 改 > 先查询出要修改的对象才能进行修改 ```python user = User.objects.get(pk=1) user.username = 'hello' user.password = 'admin' user.save() ``` #### 4.3.4 查 > 查的方法有很多, 根据返回类型来分类, 官网可查 * 过滤器对象中的参数 > 其中包括常见的运算符: 大于小于包含 > > 用法为`字段__gt` ## 5. 遇到的问题 ### 5.1 使用`iframe`框架时无法显示 > ```python > # 设置允许Iframe访问 > X_FRAME_OPTIONS = 'ALLOWALL' > ``` > > 在主项目配置文件中加入这一行