Django入门
创建应用
使用一个应用开发一个业务模块,这里创建一个图书信息的应用
python manage.py startapp bookinfo
-
_init.py_是一个空文件,表示当前目录booktest可以当作一个- python包使用。
-
tests.py文件用于开发测试用例,在实际开发中会有专门的测试人员,这个事情不需要我们来做。
-
models.py文件跟数据库操作相关。
-
views.py文件跟接收浏览器请求,进行处理,返回页面相关。
-
admin.py文件跟网站的后台管理相关。
创建完成之后在settings.py的 INSTALLED_APPS中添加bookinfo的应用。
INSTALLED_APPS = [
‘django.contrib.admin’,
‘django.contrib.auth’,
‘django.contrib.contenttypes’,
‘django.contrib.sessions’,
‘django.contrib.messages’,
‘django.contrib.staticfiles’,
‘bookinfo’,
]
设计模型
设计一个图书类
模型类的定义在models.py中,继承自models.Model类。在创建是不需要定义主键,在表生成时django会为我们自动添加主键,并且自动增长。
from django.db import models
class BookInfo(models.Model):
book_name = models.CharField(max_length=20)
book_auther = models.CharField(max_length=20)
book_pub_date = models.DateField()
设计完模型类之后进行数据迁移:
python manage.py makemigrations
python manage.py migrate
执行第一条语句之后再我们创建的应用里的migrations里会多一个0001_initial.py的迁移文件,打开后会看到django为我们自动添加了id列,并且自动增长。
执行第二条语句之后会将该迁移文件中的属性,在数据库中生成对应表,在mysql中使用以下语句查看表结构:
desc bookinfo_bookinfo;
设计一个图书详情类
步骤同图书类的创建
class BookDetail(models.Model):
book_price = models.FloatField()
book_auther = models.CharField(max_length=20)
book_pages = models.IntegerField()
迁移文件
python manage.py makemigrations
python manage.py migrate
数据表的增删改查
- 完成数据表的迁移之后,接下来对数据进行操作
python manage.py shell
首先导入bookinfo/modules中的类,新建图书对象
from datetime import date
from booktest.models import BookInfo,BookDetail
book=BookInfo()
book.book_name=“Django入门”
book.book_pub_date=date(1991,1,31)
book.save()
使用book.delete()删除对象
使用BookInfo.objects.all()获取全部信息
重新对类属性赋值即为修改
管理站点
通常再Django项目中都需要进行后台管理,Django能够根据定义的模型类自动生成管理页面。
首先创建一个超级用户
python manage.py createsuperuser
输入用户名,邮箱密码之后,创建成功。在后台中我们并没有注册模型,所以再admin.py中注册模型类。
from django.contrib import admin
from bookinfo.models import BookInfo,BookDetail
admin.site.register(BookInfo)
admin.site.register(BookDetail)
启动django服务,登陆127.0.0.1:8000/admin进入后台管理
python manage.py runserver
启动后会发现,列表信息为BookInfo objects,需要点进去才能看到图书信息,这样不方便管理,所以我们自定义列表显示为我们的图书信息。
将admin.py更新为以下代码:
from django.contrib import admin
from django.contrib import admin
from bookinfo.models import BookInfo,BookDetail
class BookInfoAdmin(admin.ModelAdmin):
list_display = [‘id’,‘book_name’,‘book_pub_data’]
class BookDetailAdmin(admin.ModelAdmin):
list_display = [‘id’,‘book_price’,‘book_auther’,‘book_pages’]
admin.site.register(BookInfo, BookInfoAdmin)
admin.site.register(BookDetail, BookDetailAdmin)
重启服务器,得到我们想要的结果。
视图及URL
后台管理页面做好了,我就需要做公共访问的页面了,而刚才我们输入的http://127.0.0.1/admin/就是一个url请求,服务器收到这个请求之后会有一个处理,并返回。这个过程就是我们由视图来完成。
-
定义视图函数
视图函数被定义在views.py中,首先我们定义一个index,即首页。
from django.shortcuts import render
from django.http import HttpResponse
def index(request):
return HttpResponse(“这是首页”) -
配置URLs
请求者在浏览器中输入URL,向服务器发送请求,服务器会在编写好的URLconf中逐条匹配,如果匹配成功则返回对应的视图函数,若没有匹配成功,则返回404 Page Not Found。
-
首先我们在bookinfo下新建urls.py文件,定义一个列表,用来匹配views.py中的视图函数。
from django.urls import path
from bookinfo import views
urlpatterns = [
path(’’, views.index),
] -
打开项目文件夹中的urls.py文件,为urlpatters列表添加我们创建的urls。
from django.contrib import admin
from django.urls import path
from django.conf.urls import include
urlpatterns = {
path(‘admin/’, admin.site.urls),
path(‘index/’, include(‘bookinfo.urls’))
} -
在浏览器中输入http://127.0.0.1/index/则显示“这是首页”。
注意
在Django2.0之后的版本中,默认不使用正则匹配URLS,如果想用正则进行匹配,则需要导入模块。
from django.urls import re_path
由re_path替换path即可。
模板
当我们想要让我们的页面变得更加好看,我们就需要用到模板文件了。
-
创建模板
在项目文件夹中新建文件夹templates,创建一个与应用同名的文件夹,名为bookinfo。
-
设置模板路径
在settings.py文件中设置TEMPLATES的DIRS值。
‘DIRS’: [os.path.join(BASE_DIR, ‘templates’)]
-
定义模板
打开templates/bookinfo,创建index.html文件<html lang="en"> <head> <meta charset="UTF-8"> <title>这是标题</title> </head> <body> <h2>图书列表</h2> <ul> {% for book in books %} <li>{{ book.book_name }}--<a href="/delete{{ book.id }}">删除</a></li> {% endfor %} </ul> </body> </html>
-
添加删除功能
在views.py中添加delete函数
def delete(request, book_id):
book = BookInfo.objects.get(id=book_id)
book.delete()
return redirect(’/index’)为了使用方便快捷,使用redirct重定向回首页。
-
在bookinfo的URL列表中添加delete函数
urlpatterns = [
path(‘index/’, views.index),
re_path(’^delete(\d+)$’, views.delete),
]
重启服务器得到我们想要的结果。
注意
可能会遇到的问题
页面显示不出来,第一步看后台报错信息
-
编码问题/后台管理问题
后台报错
UnicodeDecodeError: ‘gbk’ codec can’t decode byte 0xa6 in position 9737: ill
页面显示
A server error occurred. Please contact the administrator
在系统设置中,区域和语言->管理语言设置->更改系统区域设置->将使用Unicode UTF-8 提供全球语言支持 打钩
使用windows系统做开发踩的大坑坑,所以搞开发还是Linux