首先要告诉Django,你准备把接下来的html页面存放在哪里,那么需要打开settings.py文件,找到TEMPLATES选项,修改其中的DIRS属性,在这里添加我们的html文件夹位置
# project.settings.py
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
一般我们会把存放HTML的文件夹名字命名为template,翻译过来就叫做模版文件,至于为啥叫模版,我们稍后来揭晓
1.2 创建模板有了这个文件夹的配置之后,接下来在项目根目录下创建与配置同名的文件夹template/
并在其中书写一个简单的html,并命名为index.html
hi
真不错
今天这个天气是晴天
1.3 视图渲染
有了html,目录也配置好了,那么紧接着就是让视图去返回这个文件,那么现在我们要引入一个新的方法叫做render,这个方法专门用来返回一个html页面,并且在未来,我们还会了解到这个方法的更高级用处,就是传递上下文模版变量
修改app下的视图方法,返回这个页面,页面路径不需要绝对路径,使用*template/*下的相对路径即可
# app.views.py
from django.shortcuts import render
def index(request):
return render(request, 'index.html')
1.4 模版变量渲染
来简单修改一些刚才的index.html页面
hi
真不错
今天这个天气是{{ weather }}
而视图部分,此时可以通过在视图函数内部定义相关的模版变量,来让它通过视图函数去返回
在页面中,模版变量叫做weather,那么在视图函数代码中,就需要有一个映射格式数据,他的key值对应html页面中的模版变量,而value将是这个模版变量渲染的结果
# app.views.py
from django.shortcuts import render
def index(request):
content = {'weather': '晴天'}
return render(request, 'index.html', content)
同时,因为html页面中更加强大,支持了模版变量这样的内容,所以我们也不在将django中所编写html称作html页面,而是叫做模版页面
那么render方法,我们也可以来做一下总结,render可以用来返回一个模板页面,并将一个字典组合成的模板变量传递到模板页面上,完成页面的渲染
render(request, template_name, context=None) ''' request: 固定接收 request 请求,与视图 han s 第一个参数相同 template_name: 为一个可以找到的模板页面,填写配置 template 的相对路径即可 context: 模板页面所需模板变量,是一个字典格式,key 为模版变量,value 为渲染的值 '''1.5 模版语句循环、分支
for 标签
模板中的标签{% for %}与Python中的for循环类似,要记得有闭合模板标签{{ endfor }}
{% for var in sequence %}
{{ var }}
{% endfor %}
- 注意:模板语言中,不会出现索引超出范围的IndexError或者Key值不存在的KeyError,取不出任何东西则只是一个空
在模版中,可以通过{% if %}标签语法来进行模板变量的值判断;
{% if test_list %}
列表不为空
{% elif test_dict %}
列表为空,字典不为空
{% else %}
列表字典均为空
{% endif %}
1.6静态资源配置
需要我们首先在项目中创建目录保存对应的静态资源,该目录名常为static/
- 在settings中配置静态文件目录路径,添加如下内容
STATICFILES_DIRS = (
os.path.join(BASE_DIR, 'static'),
)
# STATICFILES_DIRS 该配置项用来告诉 django 在查找静态资源时,应该访问哪个目录
在项目中创建***static/***目录,***static/目录下创建专门保存图片的img/***目录,在里面存一张图片
有了图片,接下来在模板页面中去引入并使用它,打开index.html进行修改
{% load staticfiles %}
hi
{{ message }}
这里用到了一个特殊语法,{% %}这个叫模版标签,模版标签不同于模板变量**,模版标签经常用来加载数据,或这是一些处理**逻辑,**使用模版标签可以方便我们在模板页面上实现某些只有在后台代码中才可以实现的逻辑功能
2. ORM映射 2.1 ORM映射概念ORM映射关系,是django与数据库之间的一个桥梁,可以使开发者不再关注如何去编写SQL语句,直接通过一套ORM所提供的API接口即可方便对各种数据库进行交互
2.2 模型类编写通过ORM映射在models.py文件中创建模型类
#myapp/models.py
from django.db import models
# Create your models here.
class Weather(models.Model):
weather = models.CharField(max_length=100,verbose_name="天气")
class Meta: # 定义元类
verbose_name_plural = "天气" # 可以控制模型类的属性 在后台管理站点中看到的效果
# 设置当前表名的一个可读的性更好的名字
def __str__(self): # 控制后台管理站点中添加对象的名字
return self.weather # 将天气2个字返回 效果都是在后台管理中站点看到的
在这里我们使用到了 django 的ORM映射关系用来创建数据库表,继承自models.Model类,
一个类用来表示一张表,类中的一个属性代表一个字段
代码中定义了一个类型为CharField,长度为100的字段,用来存储天气
下面的class Meta是模型类的元类,用来设置当前表的一些属性,比如联合约束,排序条件等
使用verbose_name_plural属性设置当前表在admin后台查看时的名字
代码中定义一个属于实例的函数**__str__,用来描述当前数据在返回时的默认展示结果**
django在创建模型类对应的数据表时,默认使用应用名加下划线加模型类名作为表的名字,比如当前 Weather 表名为:myapp_weather
- 当某个子应用APP涉及到了数据库的使用时,要记得在settings文件中进行配置
#myproject/settings.py
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'myapp',
]
2.3 迁移文件
python manage.py makemigrations # 创建数据库迁移文件
python manage.py migrate # 根据数据库迁移文件生成对应 SQL 语句并执行
进入admin界面,初次访问连接:127.0.0.1/admin,会提示我们输入账号密码,这是因为admin界面是需要一个超级管理员来登陆访问的,所以还需要我们创建对应的admin界面下的超级用户
- 创建admin超级用户,使用manage.py命令行工具执行如下命令并按照提示创建即可
python manage.py createsuperuser
在输入太短(不满足 8 位),或是只包含数字的简单密码,超级用户的创建是会报一个警告的错误的,不影响继续运行
这是因为默认的表创建之后,还需要通过对应app下的admin.py文件进行admin后台注册,只有注册在这个文件中的模型类对应的表才可以在admin界面所看到
- 在app下的admin.py文件中进行模型类的注册
#myapp/admin.py from django.contrib import admin from myapp import models admin.site.register(models.Weather) #使用 register 函数接收模型类作为参数即可完成注册
注册成功之后,在服务器,通过浏览器访问admin界面,就可以看到创建好的Weather表了
2.5 ORM视图操作这里使用all方法,代表获取某表中的所有数据
# myapp/views.py
from django.shortcuts import render
from myapp import models
def index(request):
weathers = models.Weather.objects.all()
content = {
"weathers": weathers,
}
return render(request, 'index.html', content)
修改一下对应的要渲染的 HTML 页面,使其渲染遍历出每一条数据
hi
{% for weather in weathers %}
{{ weather }}
没有任何天气
{% endfor %}
模板标签***{% for xxx in xxxs %}***可以用来在模板.面出迭代访问取出每一个数据
***{% empty %}***标签用来判断当循环访问数据为空时要做的事情
因为HTML中并没有像Python缩进这样的方式来控制代码块,最后循环标签要有***{% endfor %}***标签进行结束
3.总结平时多加练习,在写代码时仔细查找错误



