1. 创建django项目:
1) 创建虚拟环境
比如要在code_test文件夹下创建虚拟环境,在cmd中,code_test对应的路径中输入命令: virtualenv venv
这样就创建了venv文件夹,在cmd中进入venv/Scripts, 运行activate文件,就进入了虚拟环境,此时命令行开头为(venv)
(上述操作也可以在pycharm中的terminal中进行)
2) 创建django项目
虚拟环境中,安装django, pip install django==2.2 (2.2为django的版本号)
创建一个django项目: django-admin startproject Message(项目名称是Message)
Message项目内部结构如下:
Message项目在创建时,会自动创建一个同名的Message文件夹,其中包含一些整个项目的配置文件,其他文件夹都是后期自己添加的。
在执行完创建django项目的命令后,你就可以尝试run这个项目了。
在pycharm的terminal中输入命令 python manage.py runserver
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.
[25/Feb/2020 21:30:26] "GET / HTTP/1.1" 200 16348
[25/Feb/2020 21:30:26] "GET /static/admin/css/fonts.css HTTP/1.1" 304 0
[25/Feb/2020 21:30:26] "GET /static/admin/fonts/Roboto-Regular-webfont.woff HTTP/1.1" 304 0
[25/Feb/2020 21:30:26] "GET /static/admin/fonts/Roboto-Light-webfont.woff HTTP/1.1" 304 0
[25/Feb/2020 21:30:26] "GET /static/admin/fonts/Roboto-Bold-webfont.woff HTTP/1.1" 200 82564
点击上面返回内容中的网址 http://127.0.0.1:8000,就可以打开django的环境页面
在网址中添加/admin,也可以访问django的后台:
创建app, 并在settings.py中进行绑定:
命令: python manage.py startapp message_form,创建完成后,生成message_form对应的文件夹,我们可以将message_form拖拽到一个大的文件夹apps中,并将message_form文件夹中的apps.py类中的 MessageFormConfig 类中的 name 改成apps.message_form。
再在settings.py文件中,INSTALLED_APPS字段中添加 apps.message_form.apps.MessageFormConfig
2. 让浏览器显示一个html
步骤:
1) 配置url
2) 配置对应的views逻辑
3) 拆分静态(css,js, img)放入static文件夹下, html放入templates文件夹下
a. static文件夹也可以放到每个app目录下
b. 也可以放入全局的static和tempaltes文件夹下
4) 配置全局的static文件夹访问路径, 在setting.py中添加 STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]
假设我们有一个写好的html文件,我们将其先存在templates文件夹中,然后我们需要在settings.py中添加templates文件夹,作为模板。
然后,我们就可以利用一个函数打通html到网址之间的关联了:
在全局的urls文件中添加路由地址:
from django.contrib import admin
from django.urls import path
from apps.message_form import views
# import apps.message_form.views as views
urlpatterns = [
path('admin/', admin.site.urls),
path('index/', views.get_message_form)
]
在app中的views文件夹中,生成函数:
from django.shortcuts import render
def get_message_form(request):
return render(request, 'message_form.html')
这样,我们就将url = index 和函数 get_message_form绑定到了一起,而get_message_form中有会关联html文件,此时运行文件,在地址栏输入index,就可以访问html页面了
* 当我们把html中的style部分抽出,放入一个单独的css文件中时,我们可以选择把css文件放入app下面的static文件夹中,或者放入全局的static文件夹中,但是当你选择放入全局的static文件夹中时,我们需要在settings.py文件中添加相关的变量,指向全局static文件夹的位置:
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]
* 无论css文件放在那里,我们都需要在html文件中添加相应的link字段,指向这个文件
<link rel="stylesheet" href="/static/style.css">
3. 配置数据库
创建django项目时, 在settings.py中绑定的数据库是sqlite3,但是一般情况下,我们都不会使用这个数据库,下面我们来说说,将数据库配置成mysql的过程。
django中有对数据库相关的说明:
如果你想使用其他数据库,你需要安装合适的 database bindings ,然后改变设置文件中 DATABASES 'default' 项目中的一些键值: ENGINE -- 可选值有 'django.db.backends.sqlite3','django.db.backends.postgresql','django.db.backends.mysql',或 'django.db.backends.oracle'。其它 可用后端。 |
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'mydatabase',
'USER': 'mydatabaseuser',
'PASSWORD': 'mypassword',
'HOST': '127.0.0.1',
'PORT': '5432',
}
}
具体操作流程如下:
1) 在settings.py文件中,修改数据库相关的字段:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': '数据库名',
'USER': 'root',
'PASSWORD': 'root'
}
}
2) 在navicate中创建数据库,数据库名称同上
此时,执行命令python manage.py runserver, 会出现报错, 这个报错的原因是没有安装 mysql的驱动
3) 安装 mysql 驱动 -- mysql_client
因为mysql_client安装经常出错,所以可以在这个网站上,下载安装包,再进行安装:https://www.lfd.uci.edu/~gohlke/pythonlibs/
在页面搜索 mysqlclient, 点击进入下载页面:
根据自己本机安装的python 版本,选择安装包,比如python 3.7 64bit,则选择倒数第二个安装包进行安装
下载完成后,在pycharm的terminal中,进入虚拟环境,cd到安装包保存的路径下, pip install 安装包名,安装成功后,在pycharm的 file --> settings -->project Interpreter --> 查看有mysqlclient 1.4.6
此时,在pycharm中运行命令, python manage.py runserver, 执行成功。
* 注意: 如果在成功安装了 mysql_client 之后,仍然包和第二步中相同的错,可以按照这篇博文中的方法修改数据库密码的加密方式 https://blog.youkuaiyun.com/jianglili611/article/details/100020278
以下命令是在cmd窗口下完成的。
1.登录mysql,连接用户为root。
> mysql -u root -p
2.执行命令查看加密方式
> use mysql;
> select user,plugin from user where user='root';
3.执行命令修改加密方式
> alter user 'root'@'localhost' identified with mysql_native_password by 'yourpassword';
4.属性权限使配置生效
> flush privileges;
4. 将models存入数据库
当我们完成了3中关联新的数据库的过程后,我们此时查看navicate中对应数据库,发现并没有任何数据表,要将django中基本的配置保存到数据库中,需要执行如下命令:
1) 编辑 models.py
文件,改变模型。(当我们没有修改数据模型 models.py时,这步可以skip)
2) python manage.py makemigrations
--> 生成迁移文件
3) python manage.py migrate
--> 执行迁移过程
用两步来创建数据库中的文件,或者更新数据库中的文件,方便进行版本控制,实现数据库的平滑修改。
执行makemigrations:
执行 migrate:
此时在数据库中会发现新增了很多表格,此时就已经将django中的记录同步到了数据库:
自定义models.py:
1) 在models文件中定义表的各个字段:
from django.db import models
# Create your models here.
class Message(models.Model):
name = models.CharField(max_length=20, verbose_name='姓名') # verbose_name相当于备注
email = models.EmailField(verbose_name='邮箱')
address = models.CharField(max_length=100, verbose_name='地址')
message = models.TextField(max_length=200, verbose_name='留言') # Textfield没有长度限制
class Meta:
verbose_name = '留言板'
verbose_name_plural = verbose_name
2) 执行生成迁移文件 : python manage.py makemigrations
3) 执行数据库迁移: 生成models中类 Message对应的表格: python manage.py migrate
执行成功后,会看到在app的migrations文件夹下,生成了文件0001_initial.py,这个文件记录了迁移数据的过程
同时在数据库中,我们看到生成了新的表格 message_form_message, 这个表格的命名规则是,app名 + 类名,如果我们想自定义数据库中表格的名字,可以在models.py文件中添加一个db_table字段,来指定数据库名。
from django.db import models
# Create your models here.
class Message(models.Model):
name = models.CharField(max_length=20, verbose_name='姓名')
email = models.EmailField(verbose_name='邮箱')
address = models.CharField(max_length=100, verbose_name='地址')
message = models.TextField(max_length=200, verbose_name='留言') # Textfield没有长度限制
class Meta:
verbose_name = '留言板'
verbose_name_plural = verbose_name
db_table = 'message'
再执行生成迁移文件,和迁移过程:
关于我们定义models时,可以使用的字段有哪些,Meta中的字段有哪些,可以参考django文档中的说明 :
https://docs.djangoproject.com/zh-hans/2.2/ref/models/options/#verbose-name-plural
5. 数据库的增删改查
##### 可能出现的报错 #####
File "D:\better\venv\lib\site-packages\django\views\debug.py", line 332, in get_traceback_html
t = DEBUG_ENGINE.from_string(fh.read())
UnicodeDecodeError: 'gbk' codec can't decode byte 0xa6 in position 9737: illegal multibyte sequence
可以修改对应文件夹下的debug.py文件:
with Path(CURRENT_DIR, 'templates', 'technical_500.html').open() as fh:
--> with Path(CURRENT_DIR, 'templates', 'technical_500.html').open(encoding="utf-8") as fh:
1. 数据的查找:
1)Message.objects.all() --> 获取所有数据, 返回的是 queryset 对象
a. queryset 对象可以进行循环 / 切片(可以当作列表处理)(可以用query来查看对应的sql语句)
b. queryset 本身并没有执行sql操作,在for循环中才真正进行了sql操作
from django.shortcuts import render
from apps.message_form.models import Message
# Create your views here.
def get_message_form(request):
all_message = Message.objects.all()
slice_query = Message.objects.all()[:1]
print(all_message.query)
print(slice_query.query)
return render(request, 'message_form.html')
返回值: Quit the server with CTRL-BREAK.
SELECT `message`.`name`, `message`.`email`, `message`.`address`, `message`.`message` FROM `message`
SELECT `message`.`name`, `message`.`email`, `message`.`address`, `message`.`message` FROM `message` LIMIT 1
from django.shortcuts import render
from apps.message_form.models import Message
# Create your views here.
def get_message_form(request):
all_message = Message.objects.all()
print(type(all_message))
for each in all_message:
print(each.name)
return render(request, 'message_form.html')
all_message 的数据类型是: <class 'django.db.models.query.QuerySet'> 这种数据类型必须通过for循环,才能取出其中的值。
而all_message中的每个值each,其实是Message类中的对象,<class 'apps.message_form.models.Message'> 可以直接使用其拥有的属性,来进行查询。比如: each.name。
也就是说,只有使用for循环,才是真正的对数据库中的数据进行操作。
all_message.delete() --> 会删除整个数据库
2) Message.objects.filter() --> 获取指定条件的数据, 对应where 语句, 返回的是 queryset 对象,必须通过循环来取里面的内容
from django.shortcuts import render
from apps.message_form.models import Message
# Create your views here.
def get_message_form(request):
all_message = Message.objects.filter(name = 'andy')
print(all_message.query)
print(type(all_message))
for each in all_message:
print(each.name)
return render(request, 'message_form.html')
3) Message.objects.get() --> 获取指定条件的数据, 对应where 语句, 返回的是一个对象,可以直接调用其属性
a. 如果数据不存在或者有多条数据存在,会抛出异常
from django.shortcuts import render
from apps.message_form.models import Message
# Create your views here.
def get_message_form(request):
all_message = Message.objects.get(name = 'andy')
print(all_message.name)
print(type(all_message))
return render(request, 'message_form.html')
* 注意get 和filter方法的不同
2. 数据的插入:通过实例对象插入
message = Message()
message.name = 'zhang'
message.save() # 如果存在,则更新,如果不存在则插入
from django.shortcuts import render
from apps.message_form.models import Message
# Create your views here.
def get_message_form(request):
message = Message()
message.name = 'zhang'
message.email = 'zhang@163.com'
message.address = '北京'
message.save()
return render(request, 'message_form.html')