0.所使用的版本(用前须知)
电脑系统:Windows 10
Python:3.5(此版本Python兼容1.8以上所有版本Django,3.7对低版本Django不兼容)
Django:1.8.2(Django2和Django1在一些指令上有一些出入,想用Django2的需要自己找一下教程)
Python版本与Django的兼容性:(绿色代表兼容,红色代表不兼容)
1.创建虚拟环境
使用mkvirtualenv指令
pip install virtualenv # 安装虚拟环境
pip install virtualenvwrapper # 安装虚拟环境扩展包
mkvirtualenv 虚拟环境名 # 创建虚拟环境,例:mkvirtualenv bj18-py3
另一种指令
python -m venv bj18-py3 # 这个指令是在其他教程里面看到的,推荐使用mkvirtualenv指令
激活虚拟环境
bj18-py3\Scripts下 activate.bat # 直接输入activate(输入a按tab)也可以
这是Windows系统下的激活方法,Linux系统的激活方法是workon 虚拟环境名
退出虚拟环境
deactivate # 在虚拟环境中输入即可,不用到Scripts里
安装Django1.8.2
pip install django==1.8.2 # 到pycharm的setting里安装也可以,但记得要勾选specifiied version
2.项目创建
在bj18-py3\bj18文件夹下(bj18是新建的文件夹,不创建此文件夹也可以)
django-admin startproject test1
设置语言和时区
bj18\test1\test1\settings.py
LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai'
创建app
bj18\test1
django-admin startapp booktest
安装app
bj18\test1\test1\settings.py
INSTALLED_APPS = [] # 后面加上'booktest'
设置model
bj18\test1\booktest\models.py里面,定义需要的类(详见第3部分)
迁移表
bj18\test1
python manage.py makemigrations
python manage.py migrate
运行服务器
bj18\test1
python manage.py runserver
默认的网页是http://127.0.0.1:8000
有时候,执行runserver的时候会显示端口被占用,这时可以在runserver后面自己指定ip和端口
终止服务器
Keyboard Intertupt:按键Ctrl + C
3.设置模型类
定义一个模型类
class 类名,例:
class BookInfo(models.Model): # HeroInfo同理
变量设置:
# 图书名称,CharField说明是一个字符串,max_length指定字符串的最大长度
btitle = models.CharField(max_length=20)
# 出版日期,DateField说明是一个日期类型
bpub_date = models.DateField()
说明:常见的Model字段类型
- IntegerField 整数
- DecimalField 固定精度的十进制数,max_digits=数字最大位数,decimal_places=小数最大位数
- CharField 字符串字段,max_length=最大字符数
- BooleanField 布尔字段,如果想要用null为空值,使用NullBooleanField
- DateField 日期字段,auto_now=True最后修改日期,auto_now_add对象创建日期
- DateTimeField 时间和日期字段,同样可以使用auto_now和auto_now_add
- FloatField 浮点数字段
- ImageField 图片字段
- TextField 大文本字段
- TimeField 时间字段,同样可以使用auto_now和auto_now_add
- URLField 保存URL的字符串字段,max_length=最大长度,默认200
- EmailField 邮箱字段,max_length=最大长度,默认75,改成254兼容所有
- FileField 文件上传字段,不支持primary_key和unique,upload_to=保存文件的本地文件系统
在网页上显示的是BookInfo,想要显示书名:
def __str__(self):
# 返回书名
return self.btitle
通过模型操作表(示例)
bj18\test1
增加数据:
python manage.py shell
from booktest.models import BookInfo
b = BookInfo()
b.btitle = '天龙八部'
from datetime import date
b.bpub_date = date(1990, 1, 1)
b.save()
通过模型类名查找表中数据:
BookInfo.objects.get(id=1) # 直接返回所有信息
b2 = BookInfo.objects.get(id=1)
b2.btitle
b2.bpub_date # 查找信息 多查一
修改:
b2.bpub_date = date(1990, 10, 10)
注意:修改完要保存才能生效
b2.save()
删除:
b2.delete()
书下面所有的英雄:
b.heroinfo_set.all() # 英雄类的外键是书 一查多
查所有:
BookInfo.objects.all()
HeroInfo.objects.all()
4.后台管理
新建管理员
bj18\test1
python manage.py createsuperuser
登录管理员界面:http://127.0.0.1:8000/admin/
注册模型类:
bj18\test1\admin.py
from .models import BookInfo, HeroInfo # .models不好使时尝试使用booktest.models
admin.site.register(BookInfo)
admin.site.register(HeroInfo)
此时在上面的网址上就会出现Booktest(没出现的可以重新运行runserver)
以表格形式显示(自定义模型管理类)
bj18\test1\admin.py
class BookInfoAdmin(admin.ModelAdmin):
list_display = ['id', 'btitle', 'bpub_date']
英雄类的自定义同上
最后在注册模型类后面加上BookInfoAdmin
bj18\test1\admin.py
admin.site.register(BookInfo, BookInfoAdmin)
5.视图函数
一个简单的视图函数
1.定义视图函数,HttpRequest
bj18\test1\booktest\views.py
# http://127.0.0.1/index
def index(request):
# 进行处理,和M、T进行交互
return HttpResponse('hello world')
2.进行url配置,建立url地址和视图的对应关系
bj18\test1\test1\urls.py
urlpatterns = [
url(r'^admin/', include(admin.site.urls)), # 配置项目
url(r'^', include('booktest.url')), # 包含booktest应用中的url文件,只需要匹配开头
# Django2的url配置与Django1不同,需要特别注意
]
bj18\test1\booktest\urls.py(这个需要自己新建一个)
from django.conf.urls import url
from . import views # 这块如果报错可以尝试一下from booktest import views
urlpatterns = [
# 通过url函数设置url路由配置项
url(r'^index', views.index), # 建立/index和视图index之间的关系
]
]
输入http://127.0.0.1:8000/index,就会出现hello world
查找顺序
- 先到应用的urls.py查找,第二个匹配成功
- 执行对应的处理动作
- 到booktest\urls.py里面查找,匹配成功
- 到视图查找views.index
配置url时有两种语法格式
url(正则表达式, 视图函数名)
url(正则表达式, include(应用中的urls文件))
注意:
- 这时候去输入http://127.0.0.1:8000/,会因为匹配不到对应的网页而报错。如果想要让http://127.0.0.1:8000/显示成http://127.0.0.1:8000/index,可以在bj18\test1\booktest\urls.py里面添加一行:
url(r'^$', views.index)
- 斜杠的兼容:如果想要网页输入http://127.0.0.1:8000/index和http://127.0.0.1:8000/index/都显示index,则要补充正则:
url(r'^index[/]?$', views.index) # [/]?表示有0个或1个斜杠
6.模板操作
创建模板文件夹
在项目文件夹下新建templates文件夹,用于盛放html文件
为了不混淆应用,再在templates下面新建个booktest文件夹
配置模板目录
from django.template import loader, RequestContext # 需要导入的模块
# 1.加载模板文件
temp = loader.get_template('booktest/index.html')
# 2.定义模板上下文(给模板文件传递数据)
context = RequestContext(request, {})
# 3.模板渲染(产生标准的html内容)
res_heml = temp.render(context)
# 4.返回给浏览器
return HttpResponse(res_heml)
实际使用时,可以把这四步封装在一个函数中
def my_render(request, template_path, context_dict={}):
"""使用模板文件"""
# 1.加载模板文件
temp = loader.get_template(template_path)
# 2.定义模板上下文(给模板文件传递数据)
context = RequestContext(request, context_dict)
# 3.模板渲染(产生标准的html内容)
res_heml = temp.render(context)
# 4.返回给浏览器
return HttpResponse(res_heml)
使用模板变量:可以在html中使用从视图中传递过来的数据(上下文字典)
模板代码段:{% 要执行的代码 %}
模板变量使用:{{ 模板变量名 }} <-- 模板变量名就是上下文字典当中的键 -->
for循环:
{% for i in list %}
中间是网页内容
{% endfor %}
如果for循环为空:
{% for i in list %}
中间是网页内容
{% empty %}
for循环遍历为空时要执行的语句
{% endfor %}
以上就是Django入门,现在可以愉快地做项目了!
我在学Django的时候,可以说是一步一个坎,现在把自己学到的经验分享一下,帮助大家少走弯路。
第一次做博客不容易,如果觉得这篇文章对你有帮助,请点个赞吧!
最后附上一些参考链接: