文章目录
在Pycharm中创建Django项目
1. 进入Pycharm,创建新的python项目,搭建虚拟环境
点击左上角file --> New project --> 命名新项目 --> create
建议选择"Virtualenv"
,搭建虚拟环境,避免以前下载的python库与本项目的库相冲突,在本项目中仅下载需要的库即可。
2. 在新项目(虚拟环境)中下载Django库
2.1
在新项目中,进入命令终端"Terminal"
注意
:查看是否进入新建项目first_try的目录,如果没有,需要通过cd
命令先进入新建项目目录当中,再进行接下来的操作。
2.2
利用pip操作下载所需要库
pip install Django # 下载Django库,其他依赖库以相同的方式下载
3. 创建Django项目
3.1
在命令终端利用Django命令创建
-
事实上pip安装Django的时候,会默认下载Django的源代码,以及一个Django-admin.exe文件,这个exe就是用来创建Django项目的;
django-admin startproject My_first_web . # 创建一个名为My_first_web的Django项目
-
创建成功后,会在项目first_try目录下面出现My_first_web目录,以及manage.py文件;
first_try |- My_first_web | │ settings.py 【项目配置】 【**时常改动**】 | │ urls.py 【配置URL与函数的对于关系】 【**时常改动**】 | │ wsgi.py 【接收网络请求】【固定不用动】 | │ asgi.py 【接收网络请求】【固定不用动】 | │ __init__.py 【固定不用动】 |- manage.py 【项目管理、项目启动、创建app、数据管理】【固定不动】
3.2
创建app文件夹
python manage.py startapp app01 # 创建一个名为app01的app文件夹
-
创建成功之后,
app01
文件夹下面会出现多个文件,在view.py
中编写视图函数;├─app01 │ │ admin.py 【固定不用动】 │ │ apps.py 【固定不用动】app启动,本质为一个类 | | migrations 【固定不用动】数据库变更记录 │ │ models.py 【重要】,对数据库进行处理,在Django中封装了orm调用MySQL,不用再下载pymysql │ │ tests.py 【固定不用动】单元测试 │ │ views.py 【重要】,放视图函数 │ │ __init__.py
3.3
将 app01
配置到 My_first_web/My_first_web
路径下的 settings.py
中的 INSTALLED_APPS
当中;
-
上面
3.2
提到app01/apps.py本质是一个名为App01Config
的类;# # apps.py class App01Config(AppConfig): default_auto_field = 'django.db.models.BigAutoField' name = 'app01' # app的名字
-
在
settings.py
的INSTALLED_APPS
当中引入app的类app01.apps.App01Config
;INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'app01.apps.App01Config', # 此步骤必不可少,每创建一个新的app文件夹,都需要将其配置到这里面 ]
3.4
设计一个简单的网页HTML
-
进入
view.py
,编写视图函数;from django.shortcuts import HttpResponse # 从Django库当中导入HttpResponse # 创建一个名为test的视图函数,作用为显示文本内容 def test(): return HttpResponse('Hello world!')
-
进入
My_first_web/My_first_web
路径下的urls.py
文件配置url;在
urls.py
中引入自己app中的视图函数:from django.contrib import admin from django.urls import path from app01 import views # 引入app01中的views视图文件 urlpatterns = [ path('admin/', admin.site.urls), path('1/', views.test) # 第一个参数'1/'为url,第二个参数为自己编写的视图函数 ]
-
生成网页
python manage.py runserver # 在命令窗口执行
得到如下网页结果:
4. 模板和静态文件
-
模板(HTML文件)一般存放在app目录下的templates文件夹下;
-
静态文件一般存放在app目录下的static文件夹下;
- 图片;
- css样式;
- JavaScript文件;
- 插件
├─static │ ├─css 【存放css样式】 │ ├─img 【存放图片】 │ ├─js 【存放JavaScript文件】 │ └─plugins 【存放插件:Bootstrap(集成的好看的css样式)、font-awesome(多样式图标)】 ├─templates 【存放HTML模板】
-
注意
:在HTML中引用静态文件时,推荐写法:{% load static %} # 先加载static这个目录 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>国奖答辩</title> </head> <body> <img src="{% static 'img/1.jpg' %}"> </table> </body> </html>
5. 模板语法(依赖于Django)
还有模板语法的HTML文件会被Django解释,将占位符替换掉,再发送到浏览器进行显示
5.1
HTML模板中的占位符
在web开发的过程中我们想要从python代码中动态获取变量,并展示在网页中。需要先在HTML模板中将想要动态展示的数据用特殊占位符
占位。
<div>{{ n1 }}</div> # {{}}记为HTML中特殊的占位符,n1为变量名,用于python数据引入
# 将name变量传给index.html,在html中找到名为n1的特殊占位符,完成数据传递
def index(request):
temp = '主页'
return render(request, 'index.html', {'n1':temp}) # 数据传递以字典的格式进行,temp可以是数字、字符串、列表.....
5.2
HTML模板中的列表索引
如果在python与HTML数据传递时,传入了一个字符串,希望在网页上分开显示列表元素,则在HTML中运用到索引。再HTML索引都是用.
,字典索引同样。
def index(request):
name = ['张三', '李四', '王五']
return render(request, 'index.html', {'n2':name})
<div>{{ n.0 }}</div> # 获取第一个元素
<div>{{ n.1 }}</div> # 获取第二个元素
<div>{{ n.2 }}</div> # 获取第三个元素
5.3
HTML模板中的循环
相HTML传递一个列表,在页面上可以循环展示
-
列表循环
def index(request): name = ['张三', '李四', '王五'] return render(request, 'index.html', {'n3':name})
<div> {% for item in n3 %} <span>{{ item }}</span> {% endfor %} </div>
-
字典循环
def index(request): name = ['ID':2323, '姓名':'张三', '电话':'12312314'] return render(request, 'index.html', {'n3':name})
<div> {% for item in n3.keys %} # 对键进行循环 <span>{{ item }}</span> {% endfor %} </div>
<div> {% for item in n3.values %} # 对值进行循环 <span>{{ item }}</span> {% endfor %} </div>
<div> {% for key, value in n3.items %} # 对键值进行循环 <span>{{ key }} = {{value}}</span> {% endfor %} </div>
5.4
HTML模板中的条件语句
def index(request):
name = '张三'
return render(request, 'index.html', {'n1':name})
<div>
{% if n1 == '张三' %}
<span>正确</span>
{% elif n1 == '李四'%}
<span>哈哈</span>
{% else %}
<span>错误</span>
{% endif%}
</div>
6. Django数据库操作
在Django内部提供了orm框架,它承担了”翻译“的工作,将简洁的代码翻译成MySQL可以识别的指令,传给mysqlclient,再发送给MySQL。
6.1
安装第三方模块
# MySQL原版也支持pymysql,但是新版兼容不太好
pip install mysqlclient
6.2
ORM
ORM可以做两件事:
- 创建、修改、删除数据库的表(不用再写SQL语句),但是不能创建数据库;
- 操作表中的数据;
6.3
创建数据库
- 启动MySQL服务;
- 用自带工具创建数据库;
6.4
Django连接数据库
需要修改Django配置,在setting.py中配置个修改,默认为文件数据库。
将DATABASES修改为刚刚创建的数据库,
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'first_web', # 数据库的名字
'USER': 'root', # MySQL的用户名
'PASSWORD': '*****', # MySQL密码
'HOST': '127.0.0.1', # 安装了MySQL的电脑的地址
'POST': 3306, # 端口号
}
}
6.5
Django操作表
在Models.py
文件中进行操作,创建一个类,即创建了一个同名(在类名前面会加上app的名字)的表。ORM会把python类翻译成SQL指令
from django.db import models
# Create your models here.
class UserInfo(models.Model):
name = models.CharField(max_length=32)
password = models.CharField(max_length=64)
age = models.IntegerField()
-- 等效SQL指令
create table app01_UserInfo(
id bigint auto-increment primary key, -- 自动定义的
name varchar(32),
password varchar(64),
age int
)
-
表关联
假如有两张表,一个部门列表(部门名称+id),一个员工列表,在员工列表中有一列所属部门,可以对这一列设置限制,让该列数据只能是部门列表中的部门对应id,即将所属部门这一列与部门列表相关联;
from django.db import models class Department(models.Model): """部门表""" title = modeLs.CharField(verbose_ name= '标题', max_Length=32) class UserInfo(models.Model): """员工表""" name = modeLs.CharField(verbose_name="姓名", max_Length=16) password = modeLs.CharField(verbose_name="密码", max_Length=64) age = models.IntegerField(verbose_name="年龄") account = models.DecimalField(verbose_name="账户余额", max_ digits=10, decimal pLaces=2, default=0) create time = models.DateTimeField(verbose_name="入职时间") ###### 对于所属部门列的设置 ###### #无约束时,问题在于:输入的id可能不在部门表当中,造成无法与部门相对应 depart_id = models.BigIntegerField(verbose_name="部门ID") # 有约束,Django提供了表单关联的命令,ForeignKey depart = models.ForeignKey(to="Department", to_field="id") # 其中 # - to,与哪张表关联 # - to_ field, 与表中的哪一列关联 # 输入这个命令之后django自动在depart后面加上_id # -生成数据列depart_id # 直接像上面那样写,不能被执行,因为如果部门表被删除,depart_id列会受到影响: # 1.级联删除 # depart = models.ForeignKey(to="Department", to_field="id", on_deLete=models.CASCADE) # 2.置空 # depart = modeLs.ForeignKey(to="Department", to_fieLd="id", null=True, blank=True, on_deLete=models.SET_NULL)
-
限制表中列储存的数据
class UserInfo(models.Model): gender_choices = ( (1, '男'), (2, '女'), ) ##### choices限制性别列只能储存1或2,分别对应‘男’‘女’,verbose_name仅仅是一个标记,便于自己看 gender = models.smallIntegerField(verbose_name="性别", choices=gender_choices)
-
创建表
打开pycharm终端,执行下面两条指令,即可根据Module.py终端类创建数据表
>>> python manage.py makemigrations >>> python manage.py migrate
mysql> show tables; +----------------------------+ | Tables_in_first_web | +----------------------------+ | app01_userinfo | | auth_group | | auth_group_permissions | | auth_permission | | auth_user | | auth_user_groups | | auth_user_user_permissions | | django_admin_log | | django_content_type | | django_migrations | | django_session | | tb1 | +----------------------------+ 12 rows in set (0.00 sec)
-
如果想要再添加表,则在Model.py中添加类,再运行上面两条指令;
-
如果不想要某个表,则在Model.py中删除该类,再运行上面两条指令;
-
如果想在某个表中在删除一列,则在Model.py的对应类中删除对应代码,再运行上面两条指令;
-
但如果想要在某个表中添加一列,则会出现问题,需要在对应类中定义该列时设置默认值或者运行为空,才能创建,因为原表格中可能已有数据;
age = models.IntegerField(default=0) age = models.IntegerField(null=True, blank=True)
6.6
Django操作表中数据
不在Model.py
文件中进行操作,类只是对表结构进行操作)
-
新建数据
想要测试添加数据的操作,需要在
views.py
中创建视图函数(主要要在urls.py中进行配置),进行访问;from django.shortcuts import render, HttpResponse from app01.Models import UserInfo # 导入Model中的对应类 def orm(resquest): # 向数据表中添加一行数据 # 1.找到表格对应的类名,类名.objects获取表格,.create添加数据 UserInfo.objects.create(name='张三', password='1234', age=23) return HttpResponse('操作成果')
mysql> select * from app01_userinfo; +----+------+----------+-----+ | id | name | password | age | +----+------+----------+-----+ | 1 | 张三 | 1234 | 23 | +----+------+----------+-----+ 1 row in set (0.00 sec)
-
删除数据
from django.shortcuts import render, HttpResponse from app01.Models import UserInfo # 导入Model中的对应类 def orm(resquest): # 删除数据,先筛选在删除 UserInfo.objects.filter('id=1').delete() # filter(筛选条件) UserInfo.objects.all().delete() # 删除所有数据 return HttpResponse('操作成果')
-
修改数据
from django.shortcuts import render, HttpResponse from app01.Models import UserInfo # 导入Model中的对应类 def orm(resquest): # 修改数据,先筛选在修改 UserInfo.objects.filter('id=1').update('age'=10) # filter(筛选条件),update(列=值) UserInfo.objects.all().update('password'='452') # 将所有数据中的password列修改为‘452’ return HttpResponse('操作成果')
-
获取数据
from django.shortcuts import render, HttpResponse from app01.Models import UserInfo # 导入Model中的对应类 def orm(resquest): # 获取数据 data_list = UserInfo.objects.all() # 获取所有数据 data_list = UserInfo.objects.filter() # 括号中放筛选条件 # 获取的data_list为一个列表,每个元素都对应一行数据,计算表中只有一行数据,也是含一个元素返回一个列表 # data_list中的每个元素不是确切的值,而仅是表中某一行的对象,通过这个对象可以获取该行每一列的数据 for obj in data_list: print(obj.id, obj.name, obj.password, obj.age) return HttpResponse('操作成果')
最后推荐一个学习视频,个人觉得很适合初学者,快速上手Django,开发简单的网页。哔哩哔哩网址:https://www.bilibili.com/video/BV1rT4y1v7uQ,感谢@银角大王-武沛齐。