- 项目创建:(此处仅说明命令行中创建项目)
- 一、settings环境配置类
- 1、介绍
- 2、用法案例 - 二、models创建表单类
- 1、介绍
- 2、用法案例
- 3、Meta详解 - 三、urls路由设置
- 1、定义路由列表 - 四、模板文件(略)
- 1、模板文件夹templates - 五、views视图功能
- 1、介绍
- 2、用法案列 - 六、admin后台管理模块
- 1、介绍
- 2、用法案列 - 七、–init–项目应用初始化
- 1、介绍
- 2、用法案列 - 八、缺失文件
- 2、数据库创建 - 九、报错信息
- 1、依赖于没有迁移的应用程序:帐户
项目创建:(此处仅说明命令行中创建项目)
1 | 复制# 创建项目 |
一、settings环境配置类
1、介绍
用于配置项目环境,如添加app 、添加中间件、导入模板、配置数据库连接、配置自定义用户模型等。
2、用法案例
1
2
3
4
5
6
7
8
9
10
11
12
13
14 复制> # 配置自定义用户模型
> AUTH_USER_MODEL = 'account.MyUser'
>
> STATIC_URL = '/static/'
> STATICFILES_DIRS = [os.path.join(BASE_DIR, 'publicStatic')]
> # 设置媒体资源的保存路径
> MEDIA_URL = '/media/'
> MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
> # 上线配置
> DEBUG = False
> ALLOWED_HOSTS = ['*']
> STATIC_ROOT = os.path.join(BASE_DIR,'static')
>
二、models创建表单类
1、介绍
1
2
3
4
5
6 复制> # Django 模型是与数据库相关的,与数据库相关的代码一般写在 models.py 中,Django 支持 sqlite3, MySQL, PostgreSQL等数据库,只需要在settings.py中配置即可,不用更改models.py中的代码,丰富的API极大的方便了使用。(用于生成对应的数据库表单能设置外键)
> 一般在创建好表单类后需要进行数据迁移,在Pycharm的Terminal窗口下:
> python manage.py makemigrations #记录改动,没有作用到数据库
> python manage.py migrate #将改动实例化,更新数据库
>
2、用法案例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 复制> # 以下为账户表单的定义与生成
> class MyUser(AbstractUser): #抽象用户
> name = models.CharField('姓名', max_length=50, default='匿名用户')
> introduce = models.TextField('简介',default='暂无介绍')
> company = models.CharField('公司', max_length=100, default='暂无信息')
> profession = models.CharField('职业', max_length=100, default='暂无信息')
> address = models.CharField('住址', max_length=100, default='暂无信息')
> # 此处省略部分代码
> def __str__(self):
> return self.name
>
> # 图片墙表单的定义生成
> class AlbumInfo(models.Model):
> id = models.AutoField(primary_key=True)
> # 以下便是设置外键连接
> user = models.ForeignKey(MyUser, on_delete=models.CASCADE, verbose_name='用户')
> title = models.CharField('标题', max_length=50, blank=True)
> introduce = models.CharField('描述', max_length=200, blank=True)
> photo = models.ImageField('图片', blank=True, upload_to='image/album/')
>
> def __str__(self):
> return str(self.id)
>
> class Meta:
> verbose_name = '图片墙管理'
> verbose_name_plural = '图片墙管理'
>
3、Meta详解
在使用 Django 的 ORM 模型进行数据库的设计时,我们常常会看到在models 中经常会出现一个 class Meta 的内部类,那它的作用是什么呢?
db_table 属性:自定义数据表的名称,是可选属性。默认数据表的命名规则为: 应用名_类名。
例如:你创建了一个名为 blog 的应用时,且你为这个应用创建了一个 User 类 的models时,
这时django会将会为你创建一张名为 blog_User 的数据表。
verbose_name 属性:自定义一个易于理解的名称,如上图,
verbose_name = ‘地址’, 用来标志这个表时用来存放地址信息的
verbose_name_plural 属性:
如果此项没有设置,Django 会使用 verbose_name + “s”来表示。model属性:
绑定模型:model = Message # 绑定models中的模型类Message
三、urls路由设置
1、定义路由列表
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 复制> ........
> from django.conf import settings
> urlpatterns = [
> # Admin后台系统
> path('admin/', admin.site.urls),
> # 用户注册与登录
> path('user/', include('account.urls')),
> ...................
> # 留言板
> path('board/', include('interflow.urls')),
> # 配置媒体资源的路由信息
> re_path('media/(?P<path>.*)', serve, {'document_root': settings.MEDIA_ROOT}, name='media'),
> ]
> # 注释: path('user/', include('account.urls')),
> # 'user/'表示127.0.0.1:8000/user的路由地址
> # include('account.urls')表示将路由信息分发给account的urls.py处理
> # re_path('media/(?P<path>.*)', .....路由的正则表达式
>
四、模板文件(略)
1、模板文件夹templates
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 复制> <!--分页功能-->
> <div class="pagelist">
> {% if pageInfo.has_previous %}
> <a href="{% url 'board' id pageInfo.previous_page_number %}">上一页</a>
> {% endif %}
> {% if pageInfo.object_list %}
> {% for page in pageInfo.paginator.page_range %}
> {% if pageInfo.number == page %}
> <a href="javascript:;" class="curPage">{{ page }}</a>
> {% else %}
> <a href="{% url 'board' id page %}">{{ page }}</a>
> {% endif %}
> {% endfor %}
> {% endif %}
> {% if pageInfo.has_next %}
> <a href="{% url 'board' id pageInfo.next_page_number %}">下一页</a>
> {% endif %}
> </div>
>
五、views视图功能
1、介绍
功能函数,如上传、登录等,可用于前后端数据交互
2、用法案列
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 复制> ............
> from django.urls import reverse
> def register(request):
> title = '注册博客'
> pageTitle = '用户注册'
> confirmPassword = True
> button = '注册'
> urlText = '用户登录'
> urlName = 'userLogin'
> if request.method == 'POST':
> u = request.POST.get('username', '')
> p = request.POST.get('password', '')
> cp = request.POST.get('cp', '')
> if MyUser.objects.filter(username=u):
> tips = '用户已存在'
> elif cp != p:
> tips = '两次密码输入不一致'
> else:
> d ={
> 'username': u, 'password': p,
> 'is_superuser': 1, 'is_staff': 1
> }
> user = MyUser.objects.create_user(**d)
> user.save()
> tips = '注册成功,请登录'
> logout(request)
> return redirect(reverse('userLogin'))
> return render(request, 'user.html', locals())
>
六、admin后台管理模块
1、介绍
Django的admin可以提供一个强大的后台管理功能,可以在web界面对数据库进行操作,我们需要修改admin.py将要操作的数据表注册到后台管理中
创建管理员账号
python manage.py createsuperuser
2、用法案列
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 复制> from django.utils.translation import gettext_lazy as _
> @admin.register(MyUser)
> class MyUserAdmin(UserAdmin):
> list_display = ['username', 'email', 'name',
> 'introduce', 'company', 'profession',
> 'address', 'telephoto', 'wx', 'qq', 'wb', 'photo']
> # 在修改界面添加mobile,qq,weChat的信息输入框
> # 将源码的UserAdmin.fieldsets转换成列表格式
> fieldsets = list(UserAdmin.fieldsets)
> # 重写UserAdmin的fieldsets,添加模型字段信息录入
> fieldsets[1] = (_('Personal info'),
> {'fields': ('name', 'introduce', 'email', 'company',
> 'profession', 'address', 'telephone',
> 'wx', 'qq', 'wb', 'photo')})
>
> # 根据当前用户名设置数据访问权限
> def get_queryset(self, request):
> qs = super().get_queryset(request)
> return qs.filter(id=request.user.id)
>
七、静态文件配置
下面的命令会将应用里面的static复制到根目录下
python manage.py collectstatic
- 调试模式:DEBUG=True,项目运行时将读取应用里的static文件夹
- 上线模式:DEBUG=False,项目运行时将读取根目录下的static文件夹
七、–init–项目应用初始化
1、介绍
在Python中定义类经常会用到init函数(方法),首先需要理解的是,两个下划线开头的函数是声明该属性为私有,不能在类的外部被使用或访问。而init函数(方法)支持带参数类的初始化,也可为声明该类的属性(类中的变量)。init函数(方法)的第一个参数必须为self,后续参数为自己定义。
2、用法案列
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 复制> from django.apps import AppConfig
> import os
> # 修改app在admin后台显示的名称
> # default_app_config 的值来自apps.py的类名
> default_app_config = 'account.IndexConfig'
>
> # 获取当前app的命名
> def get_current_app_name(_file):
> return os.path.split(os.path.dirname(_file))[-1]
>
> # 重写类IndexConfig
> class IndexConfig(AppConfig):
> name = get_current_app_name(__file__)
> verbose_name = '用户管理'
>
八、缺失文件
1
2
3
4 复制> /media/images
> /publicStatic/*
> /static
2、数据库创建
python manage.py migrate
九、报错信息
1、依赖于没有迁移的应用程序:帐户
启动django项目时报错: ValueError: Dependency on app with no migrations: account
原因没有迁移表造成的:
1
2
3
4 python manage.py makemigrations
python manage.py migrate
十、Linux部署
1、uwsgi设置
Myblog_uwsgi.ini添加: wsgi-file=/home/Myblog/Myblog/wsgi.py
#查看日志
cat uwsgi.log
停止:uwsgi –stop uwsgi.pid
启动:uwsgi –ini uwsgi.ini
2、NGINX
#查看日志
tail -f /var/log/nginx/error.log