文章目录
在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 # 在命令窗口执行得到如下网页结果:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Nrtexbz3-1660955662342)(C:\Users\NH4NO3nice\AppData\Roaming\Typora\typora-user-images\image-20220816111621330.png)]](https://i-blog.csdnimg.cn/blog_migrate/139912df564f8d0335f7378199d5281a.png)
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中配置个修改,默认为文件数据库。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-J4xRx4dU-1660955662343)(C:\Users\NH4NO3nice\AppData\Roaming\Typora\typora-user-images\image-20220817184210030.png)]](https://i-blog.csdnimg.cn/blog_migrate/badcace937ea13b71151281f75d1095a.png)
将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 migratemysql> 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,感谢@银角大王-武沛齐。
1828

被折叠的 条评论
为什么被折叠?



