Django测试开发-6-详细步骤新建APP
详细新建APP过程展示:
一、新建一个APP
目录结构:
1.1 打开一个Terminal
1.2 输入命令:
#新建APP python3 manage.py startapp my_app
目录结构如下:
二、实践简单的页面跳转(通过HttpResponse 来把内容显示到网页上-HelloWorld!)
2.1 在my_app中views中编写如下代码:
from django.http import HttpResponse def index(request):#定义一个函数,第一个参数必须是request return HttpResponse("Hello Django ! ")
2.2 在my_app中新建urls.py文件,新加如下代码:
from django.contrib import admin from django.urls import path, re_path from django.conf.urls import url,include from . import view urlpatterns = [ url(r'^$',view.index), # re_path('^index/$',view.index,name='index'), ]
2.3 在MyDjango工程下的urls中添加如下代码:
from django.contrib import admin from django.urls import path, re_path from django.conf.urls import url,include from my_app.urls import app_name from . import view from my_app import views urlpatterns = [ # path('admin/', admin.site.urls), #url(r'^admin/', admin.site.urls), # url(r'^my_app/',include('my_app.urls', namespace='my_app')), url(r'^$',view.index), #path('hello/',view.hello), #添加这一句,my_app/代表跳转到my_app APP中,views.index是关联对应views.py中的一个函数 # url(r'^my_app/',views.index), url(r'^my_app/', include(('my_app.urls',app_name), namespace="my_app")) # re_path('^index/$',view.index,name='index'), ]
2.4 启动服务:
python3 manager.py runserver 127.0.0.1:8000
2.5 在浏览器中输入:http://127.0.0.1:8000/my_app/index
三、使用渲染模板的方法来显示内容
3.1 在my_app的views中添加一下代码:
from django.http import HttpResponse from django.shortcuts import render # Create your views here. def index(request): ctx = {}#定义一个名为ctx的空字典 ctx["msg"] = "World ! "#以键值对方式添加一条数据到字典中 return render(request,'hello.html',ctx)#把字典作为参数返回
3.2 在my_app的urls.py中添加如下代码:
from django.conf.urls import url from my_app import views app_name = 'my_app' urlpatterns = [ url(r'^index$',views.index), ]
3.3 在my_app中添加文件夹views
3.4 在my_app/views下新建hello.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>hello,{{msg}}</h1>{#取得字典值为msg的vlues,并显示出来#} </body> </html>
3.5 在MyDjango中的settings.py中BASE_DIR+’/my_app/views’,如下图:
3.6 在MyDjango的urls.py添加如下代码:
from django.contrib import admin from django.urls import path, re_path from django.conf.urls import url,include from my_app.urls import app_name from . import view from my_app import views urlpatterns = [ # path('admin/', admin.site.urls), #url(r'^admin/', admin.site.urls), # url(r'^my_app/',include('my_app.urls', namespace='my_app')), #url(r'^$',view.index), #path('hello/',view.hello), #添加这一句,my_app/代表跳转到my_app APP中,views.index是关联对应views.py中的一个函数 # url(r'^my_app/',views.index), #因为django2相对于django1做了改动,在include函数里增加了参数app_name,表示app的名字。 url(r'^my_app/', include(('my_app.urls',app_name), namespace="my_app")) # re_path('^index/$',view.index,name='index'), ]
3.7 浏览器输入:http://127.0.0.1:8000/my_app/index
四、 创建数据库,生成数据库表
Django通过自定义Python类的形式来定义具体的模型,每个模型的物理存在方式就是一个Python的类Class,每个模型代表数据库中的一张表,每个类的实例代表数据表中的一行数据,
类中的每个变量代表数据表中的一列字段。Django通过模型,将Python代码和数据库操作结合起来,实现对SQL查询语言的封装。也就是说,你可以不会管理数据库,可以不会SQL语言,
你同样能通过Python的代码进行数据库的操作。Django通过ORM对数据库进行操作,奉行代码优先的理念,将Python程序员和数据库管理员进行分工解耦
4.1 修改MyDjango中的settings.py的代码:
INSTALLED_APPS = [ 'django.contrib.admin',#管理网站 'django.contrib.auth',#认证模块 'django.contrib.contenttypes',#内部框架 'django.contrib.sessions',#会话管理 'django.contrib.messages',#消息框架 'django.contrib.staticfiles',#映射的静态资源 'my_app',#加载到全局中 ]
DATABASES = { 'default': { 'ENGINE':'django.db.backends.mysql',#选择mysql数据库 'NAME':'my_app',#数据库的名字 'USER':'root',#mysql数据库的用户名 'PASSWORD':'123456',#mysql数据库的密码 'HOST':'127.0.0.1',#mysql数据库的主机名 'POST':3306,#mysql数据库的端口号(这个可写可不写) } }
4.2 在my_app中的models.py中添加如下代码:
from django.db import models # Create your models here. class my_app(models.Model): # 姓名长度为50,不能为空,以下的字段以此类推,但是爱好可以为空 name = models.CharField('姓名',max_length=50,null=False) sex = models.CharField('性别',max_length=2,null=False) birth = models.DateField('生日',null=False) city = models.CharField('城市',max_length=100,null=False) likes = models.CharField('爱好',max_length=50)
# age = models.IntegerField() #年龄,整型
# time_stamp = models.DateTimeField() #时间 ,datetime类型
4.3 打开数据库,新建my_app的数据库
注意:数据库的名字必须和第1步的settings.py中设置的数据库名字一样!!!
4.4 检查安装的mysql包的驱动,pip3 list
4.5 如果未安装,可执行:pip3 install pymysql
4.6 在项目工程MyDjango下的__init__.py下增加如下代码:(python3仅支持pymysql,不支持MySQLclient)
import pymysql pymysql.install_as_MySQLdb()
五、执行数据库同步
通过运行makemigrations命令,Django 会检测你对模型文件的修改,也就是告诉Django你对模型有改动,并且你想把这些改动保存为一个“迁移(migration)”。
migrations是Django保存模型修改记录的文件,这些文件保存在磁盘上。在例子中,它就是hello/migrations/0001_initial.py,你可以打开它看看,里面保存的都是人类可读并且可编辑的内容,方便你随时手动修改。
.
5.1 顺序执行如下命令: python3 manage.py makemigrations my_app
csjinDeMacBook-Pro:MyDjango chushujin$ python3 manage.py makemigrations my_app /Users/chushujin/chushujin/myworkspsace/youxinscript/MyDjango Migrations for 'my_app': my_app/migrations/0001_initial.py - Create model my_app
执行完成之后会生成
5.2 0001_initial.py中的内容:
# Generated by Django 3.0.3 on 2020-03-01 12:10 from django.db import migrations, models class Migration(migrations.Migration): initial = True dependencies = [ ] operations = [ migrations.CreateModel( name='my_app', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('name', models.CharField(max_length=50, verbose_name='姓名')), ('sex', models.CharField(max_length=2, verbose_name='性别')), ('birth', models.DateField(verbose_name='生日')), ('city', models.CharField(max_length=100, verbose_name='城市')), ('likes', models.CharField(max_length=50, verbose_name='爱好')), ], ), ]
5.3 执行如下命令:python3 manage.py sqlmigrate my_app 0001(生成sql语句)
migrate的命令将对数据库执行真正的迁移动作
csjinDeMacBook-Pro:MyDjango chushujin$ python3 manage.py sqlmigrate my_app 0001 /Users/chushujin/chushujin/myworkspsace/youxinscript/MyDjango -- -- Create model my_app -- CREATE TABLE `my_app_my_app` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `name` varchar(50) NOT NULL, `sex` varchar(2) NOT NULL, `birth` date NOT NULL, `city` varchar(100) NOT NULL, `likes` varchar(50) NOT NULL);
5.4 最后运行python3 manage.py migrate, 最终在mysql数据库中初步生成表
csjinDeMacBook-Pro:MyDjango chushujin$ python3 manage.py migrate /Users/chushujin/chushujin/myworkspsace/youxinscript/MyDjango Operations to perform: Apply all migrations: admin, auth, contenttypes, my_app, sessions Running migrations: Applying contenttypes.0001_initial... OK Applying auth.0001_initial... OK Applying admin.0001_initial... OK Applying admin.0002_logentry_remove_auto_add... OK Applying admin.0003_logentry_add_action_flag_choices... OK Applying contenttypes.0002_remove_content_type_name... OK Applying auth.0002_alter_permission_name_max_length... OK Applying auth.0003_alter_user_email_max_length... OK Applying auth.0004_alter_user_username_opts... OK Applying auth.0005_alter_user_last_login_null... OK Applying auth.0006_require_contenttypes_0002... OK Applying auth.0007_alter_validators_add_error_messages... OK Applying auth.0008_alter_user_username_max_length... OK Applying auth.0009_alter_user_last_name_max_length... OK Applying auth.0010_alter_group_name_max_length... OK Applying auth.0011_update_proxy_permissions... OK Applying my_app.0001_initial... OK Applying sessions.0001_initial... OK
如图:
my_app_my_app中的字段就是my_app中models.py中添加的字段:
六、创建超级管理员账户
6.1 命令窗口输入:python3 manage.py createsuperuser
csjinDeMacBook-Pro:MyDjango chushujin$ python3 manage.py createsuperuser /Users/chushujin/chushujin/myworkspsace/youxinscript/MyDjango 用户名 (leave blank to use 'chushujin'): root 电子邮件地址: root@qq.com Password: Password (again): 密码长度太短。密码必须包含至少 8 个字符。 这个密码太常见了。 密码只包含数字。 Bypass password validation and create user anyway? [y/N]: y Superuser created successfully.
6.2 这时候超级管理员就创建好了,运行项目(http://127.0.0.1:8000/admin)
七、把my_app app添加到Django项目中,并添加数据
7.1 admin管理系统中没有my_app站点
7.2 添加APP到Django后台
from django.contrib import admin from . import models # Register your models here. admin.site.register(models.my_app)
如图:
7.3 新添加的APP显示英文,需要将英文改成中文
class Meta: # 设置APP别名 verbose_name = '我的app' verbose_name_plural = '我的APP'
from django.db import models # Create your models here. class my_app(models.Model): ''' python3 manage.py makemigrations python3 manage.py sqlmigrate my_app 0001 python3 manage.py migrate ''' class Meta: # 设置APP别名 verbose_name = '我的app' verbose_name_plural = '我的APP项目' # 姓名长度为50,不能为空,以下的字段以此类推,但是爱好可以为空 name = models.CharField('姓名',max_length=50,null=False) sex = models.CharField('性别',max_length=2,null=False) birth = models.DateField('生日',null=False) city = models.CharField('城市',max_length=100,null=False) likes = models.CharField('爱好',max_length=50)
然后重新运行项目,在页面就会看到my_app变成中文的中文了
7.4 添加各字段
添加成功如图:
我的APP项目下的内容仍是英文:(原因是没有把项目连接到admin.py)
需修改:my_app/admin.py
from django.contrib import admin # Register your models here. from . import models #继承ModelAdmin类 class my_app_admin(admin.ModelAdmin): list_display = ['name','sex','birth','city','likes'] admin.site.register(models.my_app,my_app_admin)