Djando项目的开发
1. Django基本流程
1.0 Django的安装
打开cmd,输入pip install Django== '版本号'
,如果不用==版本号,默认安装最新版。
验证是否安装成功,进入python目录下
1.1 Django框架
类比MVC,Django框架为MVT。
- MVC
M(model),管理数据
V(View),显示数据,依据模型数据创建
C(controller),业务逻辑处理
- MTV
M(model),管理数据
T(template),显示数据给用户,依据模型数据创建
V(View),业务逻辑处理
1.2 目录层级说明
查看目录层级,在cmd输入tree . /F
1.3 应用的创建
1.4 定义模型
#Create your models here.
#-*- coding: utf-8 -*-
from __future__ import unicode_literals
from datetime import datetime
from django.db import models
#继承django框架里设计好的用户表AbstractUser
from django.contrib.auth.models import AbstractUser
class UserProfile(AbstractUser):
nick_name = models.CharField(max_length=50, default=u'', verbose_name=u'昵称')
birth = models.DateField(verbose_name=u'生日', null=True, blank=True)
gender = models.CharField(max_length=6, choices=(('male', u'男'), ('female', u'女')), default='female',
verbose_name=u'性别')
address = models.CharField(max_length=100, verbose_name=u'地址', default=u'')
mobile = models.CharField(max_length=11, null=True, blank=True, verbose_name=u'手机号码')
avatar = models.ImageField(max_length=100, upload_to=u'avatar/%Y/%m', default=u'avatar/default.png',
verbose_name=u'用户头像')
class Meta:
verbose_name = u'用户信息表'
verbose_name_plural = verbose_name
def __unicode__(self):
return self.username
1.5 生成数据库表
1.6 数据库测试
1.7启动服务器
1.8 Admin站点管理
- 综述
- 自定义管理界面
- 关联对象
在数据设计中,有关联存在。例如添加班级时,直接将学生信息添加,可使用如下方式:
布尔值显示问题:定义一个函数,将Bool值返回为需要的字段
页面类名称的显示:属性名.short_description = '需要显示字段名称'
- 使用装饰器注册model
删除注册语句:admin.site.register(Student,StudentAdmin)
添加:@admin.register(Student)
修饰StudentAdmin
注册类
1.9 视图的基本使用
- 综述
- 定义视图
在每个应用下的view.py文件里,定义视图;
from django.shortcuts import render
from django.http import HttpResponse
from . import models
# Create your views here.
def index(request):
return HttpResponse('hello world!')
- 配置URL
修改与项目名同名的文件目录下的urls.py文件,引入app的url路径文件;
from django.contrib import admin
from django.urls import path,include
urlpatterns = [
path('admin/', admin.site.urls),
# blog为app名称,进入项目后,首先匹配是哪个app,然后将该app的urls.py引入,直接到子应用的urls文件里匹配view。
path('blog/', include(('blog.urls', 'blog'), namespace='blog'),),
]
在blog应用的目录下,创建一个urls.py的文件,用来匹配view;
from . import views
from django.urls import path
'''网页传来函数响应时,经判断是该应用下的函数index,
在view文件里,找到名为index的函数,根据函数功能,返回对应消息或页面'''
urlpatterns = [
path('', views.index)
]
1.10 模板的基本使用
- 配置模板路径
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')]
具体写一个页面的步骤:
- 1.index.html
在templates文件里创建html页面,用于接受从view返回的数据,并显示;
<head>
<meta charset="UTF-8">
<title>博客的主页面</title>
</head>
<body>
<h3>我的第一个模板文件,看我的啦!blog</h3>
{% for article in articles %}
<a href="{% url 'blog:article_page' article.id %}">{{ article.title }}</a>
<br/>
{% endfor %}
- 2.view
在模型里取出数据,传递给模板文件里的页面;
def index(request):
# 第三个参数是一个字典,主要作用将数值返回给前端
# 使用时,直接用键名即可
articles = models.Article.objects.all()
return render(request, 'blog/index.html', {'articles': articles})
- 3.注册url
urlpatterns = [
path('', views.index)
]
2. 项目创建
2.1 普通项目的建立
-
pycharm创建
打开Pycharm,新建Django项目,如果是普通项目的建立,可以创建一个新的interpreter,也可以使用已将存在的环境。
注意:因为python项目下有很多依赖包,如果Install一直不成功的话,可以选择已经存在的interpreter。因为,本人也下载了jupyter,该项目的依赖包,大都下载成功,因此,我在创建新项目时,选择的jupyter的环境(在jupyter的安装目录下,选择python.exe)。 -
cmd创建
在合适位置创建一个文件夹,用来存放项目文件。然后进入该项目下,输入django-admin startproject Test
,Test为Django项目名。
2.2 pyhton虚拟环境
为每个项目创建独立的环境。
1.首先安装虚拟环境 pip install virtualenv
2.创建一个文件夹(virtual_envs_works),用来放虚拟环境目录。
3.切换到virtual_envs_works目录下,创建新的虚拟环境virtualenv 环境名
4.下载虚拟环境管理工具,pip install virtualenvwrapper
5.配置环境变量,给WORKON_HOME 添加存储文件夹路径。
6.在cmd命令行里,用workon命令,可以查看已经存在的文件。
7.workon project
,可进入各项目的目录下,然后执行pip install 包名
,即可引入依赖包。
注意:这里,虚拟环境的各个管理命令,可在印象笔记里查看。
2.3 项目文件注解
项目建立成功后,在总项目下,有一个名字与项目名称相同的文件夹,该文件为总的app管理,该文件里有settings和urls文件。
2.4 App的添加
在项目建立界面,可以直接选择APP的建立;
如果建立时,没有建立的话,可以打开项目,在tools里运行run manage.py,然后在命令行里输入startapp [ app名称],点击回车,就可以看见新增了一个名为app名称的文件夹;
注意:新添加的app必须在settings和urls文件里注册。
app建立好后,点击该app,在新建一个名为template的文件夹,用来放html页面。
注意:因为每个项目都不止一个app,而每个app的html页面也会出现同名的情况。在Django机制里,当出现名称相同的html时,会按照在settings注册的顺序调用,为了避免该情况的出现,在app下新建立一个同名文件夹,再将template文件放在该文件下。
2.5 其他文件建立
根据需求,建立其他文件;
如:static文件夹,里面有css、js以及images文件。
upload文件夹:用户需要上传的数据。
logs:日志文件
2.6 数据库
1.在Django里,默认数据录为sqlite3。这里我们使用Mysql数据库,需要在settings文件里修改。
'NAME': 数据库ip下具体的一个库的名字,
'HOST':主机名或IP地址
'USER': 用户名
'PASSWORD': 数据库的密码,之前的我密码是空,试了几种eg'',NO找不来表示的方法,只好给数据 库设置了一个密码
'PORT':'3306' 端口号
**注意**:修改完成后run会出错,此时需要在命令行进入到该虚拟项目下,`pip3 install mysqlclient`安装数据库模块。
2.默认数据库表的迁移
在tools里运行run manage.py里,点击makemigrations
回车,再点击migrate
。
注意:此时如果迁移失败,请检查Mysql版本,Django2以上不支持Mysql5版本。
2.7 Models.py:数据库表的创建
models文件是专为数据库表创建的,在文件里,定义类,类名即为表名,属性为表的字段。在Django中,定义了很多类型的字段,我们可以直接使用。
比如:
注意:在实际的项目开发中,每个表之间都会存在关联,在运行的时候,会相互调用,这样有可能会出现死循环的情况,为了避免,我们建立一个专门进行调用的app,由他实现对各个表数据的管理。逻辑上,它比各个app高一级。但在项目上,他们属于同级。
1.User数据模型设计
在Django里,有已经设计好的用户表,我们在设计的时候可以直接继承。
注意:因为用到类系统自定义的类,需要在settings文件里注册。
User为文件名,UserProfile为用到自定义类的类名。
2.models数据模型设计
除了User App,还有其他的App,在这里仿照user建立的步骤依次建立。
注意:在数据模型设计中,会存在外键的可能,语句为
user = models.ForeignKey(UserProfile, on_delete=models.CASCADE, verbose_name=u'用户')
在课程评论中,user是外键,在django2以上,需要添加on_delete=models.CASCADE,
参数说明:
on_delete有CASCADE、PROTECT、SET_NULL、SET_DEFAULT、SET()五个可选择的值
CASCADE:此值设置,是级联删除。
PROTECT:此值设置,是会报完整性错误。
SET_NULL:此值设置,会把外键设置为null,前提是允许为null。
SET_DEFAULT:此值设置,会把设置为外键的默认值。
SET():此值设置,会调用外面的值,可以是一个函数。
3.APP目录结构优化
在项目设计中,为了方便管理APP,建立了一个文件夹,存放所有的APP,可是,当某个APP需要引入其他APP的内容时,引入会出现问题,解决的方案有两种。
- 1.将APP添加到Python的搜索目录下
在settings文件里,添加设置,将apps添加到根目录的搜索下,然后在 INSTALLED_APPS中,将注册应用的前缀app删掉。然后右键apps文件夹,点击Sources Root。
- 2.将apps文件夹直接拖进与项目名称相同的文件夹里,比如你的项目名为izengzhi,项目里会有一个izengzhi的文件夹,这里是总目录,完成项目的设置等,移到该目录下,就会在引入其他app时,识别出来。
2.8 后台管理admin
1. admin的搭建
首先创建一个超级用户:在命令台输入creatsuperuser,默认的后台管理并没有我们创建的应用数据,此时需要在每个应用的admin.py文件里注册。
注册语句:
from . import models
admin.site.register(models.UserProfile)
2. xadmin的搭建
python2.0以上+Django2.0以上,需要在命令行输入:
注意:Django3版本会出现问题,建议将版本降至2.
pip install https://codeload.github.com/sshwsfc/xadmin/zip/django2
安装完成后,需要修改部分设置。
第一步,在settings文件里注册
'xadmin',
'crispy_forms'
第二步,在urls文件里,将admin修改为xadmin
from django.urls import path
import xadmin
urlpatterns = [
# path('admin/', admin.site.urls),
path('xadmin/', xadmin.site.urls),
]
成功后,管理员页面如下:
- Model数据表的注册(在Xadmin下)
1.首先将admin里的注册语句注释
2.在每个应用的文件下,创建一个名为adminx.py的python文件
3.在adminx文件里书册数据信息
class EmailVerifyCodeAdmin(object):
# 页面显示属性
list_display = ('code', 'email', 'send_type', 'send_time')
# 过滤器
list_filter = ('code', 'email', 'send_type', 'send_time')
# 搜索
search_fields = ('code', 'email')
xadmin.site.register(EmailVerifyCode, EmailVerifyCodeAdmin)
**注意:**在注册时,遇见外键的情况,需要写成外键所属数据表中的名字。例如,Cource和Lession,每个课程都有不同章节,因此Cource是Lession的外键。
class LessonAdmin(object):
list_display = ('course', 'name', 'add_time')
# 需要将course改成course__name
list_filter = ('course__name', 'name', 'add_time')
search_fields = ('course__name', 'name')
另外,还需将model文件里的代码
def __unicode__(self):
return self.name
修改为:
def __str__(self):
return self.name
- 在Xadmin中几个常用的配置
1.修改后台主题样式
在adminx.py文件里配置
class BaseSettings(object):
enable_themes = True
use_bootswatch = True
xadmin.site.register(views.BaseAdminView, BaseSettings)
2.全局标题的配置
class GlobalSettings(object):
site_title = u'爱增值后台管理系统'
site_footer = u'小小慕公司'
# 菜单样式(伸缩)
menu_style = 'accordion'
xadmin.site.register(views.CommAdminView, GlobalSettings)
3.将主页面数据信息标题改为中文
结果如下:
方法:
1.在每个应用的apps文件里里添加verbose_name = u'课程信息'
2.在init 文件里添加default_app_config = 'izengzhi.apps.courses.apps.CoursesConfig'
3. 后台管理模块
之前建立了一个template文件夹放html文件,文件建立后,需要在全局配置的urls文件里配置,views文件里写响应函数。
在settings文件里配置静态文件的目录
STATICFILES_DIRS = (
os.path.join(BASE_DIR, 'static'),
)
- 网站首页
from django.views.generic import TemplateView
url('',TemplateView.as_view(template_name='index.html'), name='index'),
- 登录模块
首先添加html文件,然后在urls文件里注册,继续在views里写响应函数。