目录
一、前言
最近也在学习django框架,顺手记录一下学习过程,这里会详细记录操作步骤。同我一样的新手小白想要学习的可以跟着步骤走。这个项目很基础,适用于学习与熟悉django框架的朋友,后期可通过自己学习进一步深入了解。
注意事项
使用pycharm专业版,而不是社区版。因为专业版更加方便且后期一般都会使用专业版,网上有很多破解激活码可以去找一找直接白piao专业版,如果使用社区版安装django框架请自行百度流程
pycharm配置好python解释器,一般就是python3
二、创建Django项目
新建项目,项目名称可以和我写一样的 djangoProject1 。注意模板语言选择django。
这里我们先建立一个book。点击创建,等待下载django框架及资源。
创建后目录如下,目前只有红圈圈出来的,其他的是后续步骤逐步添加的。
这个就是基本的django模板。然后我们添加author(作者)和publisher(出版社)这两个软件包。我们这里通过终端新建。在pycharm左下方点击终端
分别输入 django-admin startapp author , django-admin startapp publiesher
在目录刷新一下,就可以看见author和publisher这两个包已经新建上去了。
我的项目名称是djangoProject1,所以根目录也是这个名字。
注意 每个文件中的模板代码不要删除,注释随意
文件功能简介
setting 这个文件中包括了项目的初始化设置,可以针对整个项目进行有关参数配置,比如配置数据库、添加应用等
urls是django的总的路由,用来指向以后的app应用
wsgi是django的wsgi接口,上线用的,开发时不用管
templates是创建项目自动创建的
db.sqllite3是在django中是默认使用这个,你们现在的目录里现在应该没有这个,后面步骤会设置(如需配置其配置路径为./djangoProject1/settings.py中找到DATABASES,如要使用MySQL数据库自行百度方法)。
manage.py也是创建项目时自动创建的是包含django的所有命令
再来看看我们自己新建的三个软件包book,author,publisher,一个项目基本上是每开发一个模块就要新建一个软件包,是为了避免代码混乱。这三个下的文件都是一样的。这里我直接在网上找到一张图放下
注意,url.py是需要我们自己去创建的
三、项目配置文件
settings文件功能简单介绍及配置
首先看djangoProject1下的settings.py文件。打开这个文件,我们依次往下看(文件中注释说明不用管)。
1、BASE_DIR:当前项目的根目录,通常,我们将所有的项目文件放在该根目录下,并且其他路径都是相对于BASE_DIR来定义的。
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
2、SECRET_KEY:随机的加密和解密信息的密钥。
3、BDEBUG:调试模式,默认为True,即调试状态。
4、ALLOWED_HOSTS:允许访问的IP地址设置,将IP写在[ ]列表中即可。这里我们不用管,或者可以写一个 * 表示所有IP可以访问。
5、INSTALLED_APPS:将创建的子应用添加到INSTALLED_APPS中,可以直接添加子应用名称或者子应用名称.apps.FilmConfig。这里我们将book,author,publisher写进去。
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'book.apps.BookConfig',
'author.apps.AuthorConfig',
'publisher.apps.PublisherConfig',
]
6、MIDDLEWARE:项目中用到的中间件。
7、ROOT_URLCONF:项目跟路由。
8、TEMPLATES:项目中定义的模板文件,需要配置模板路径 'DIRS'
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',
],
},
},
]
9、WSGI_APPLICATION:上线用,不用管。
10、DATABASES:数据库配置,默认为sqlite,不用管。如果是MySQL,则需要配置连接上你的用户密码IP端口。
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'filmdatabase',
'USER': ' ',
'PASSWORD': ' ',
'HOST': ' ',
'PORT': ' ',
}
}
11、AUTH_PASSWORD_VALIDATORS:配置密码验证器,不用管。
12、STATIC_URL = '/static/' : 访问静态文件的url前缀
13、本地语言与时区,不用管
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'
USE_I18N = True
USE_L10N = True
USE_TZ = True
配置三个app模型
settings已经配置完了,现在写app模型,分别在author、book、publisher下的models.py文件中写下模型。
author
from django.db import models
# 作者
class Author(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=30)
email = models.EmailField()
gender = models.BooleanField(default=True)
def __str__(self):
return self.first_name + self.last_name
publisher
from django.db import models
# 出版社
class Publisher(models.Model):
name = models.CharField(max_length=30)
address = models.CharField(max_length=100)
city = models.CharField(max_length=30)
state_province = models.CharField(max_length=30)
country = models.CharField(max_length=20)
wbsite = models.URLField()
def __str__(self):
return self.name
book
由于在book用到了author和publisher,所以我们需要将他们导入到book中来。
from django.db import models
from author.models import Author
from publisher.models import Publisher
# 书籍
class Book(models.Model):
title = models.CharField(max_length=100, verbose_name='书名')
publish_date = models.DateField(verbose_name='出版时间')
# 外键,book:author = N:1
# on_delete=models.CASCADE:级联删除
author = models.ForeignKey(Author, on_delete=models.CASCADE, verbose_name='作者')
# 多对多关系,book:publisher=N:N
publishers = models.ManyToManyField(Publisher, verbose_name='出版社')
def __str__(self):
return self.title
数据库
现在我们在终端创建迁移文件
python .\manage.py makemigrations
显示这些就是完成,然后再执行迁移
python .\manage.py migrate
显示一堆ok后就行了。然后看你的目录,刷新一下已经出现了db.sqlite3,数据库已经创建好了。
我们现在来确认一下是否创建好了。在pycharm右侧的工具栏中点击数据库图标
点击加号新建,找到SQLite打开
点文件后面的三个点,找到你的项目位置,然后点db.sqlite3。然后完成。
(这时候如果pycharm提示你没有下载驱动程序文件,点击下载就行了。)
刷新一下,有16个表,其中author_author , book_book, publisher_publisher就是我们自己的表。这里还产生了一个多对多关系的中间表,book_book_publishers就是book表和publisher的中间表。
现在我们打开终端(可以点加号新开一个),创建超级管理员。
python .\manage.py createsuperuser
回车,然后再输入admin,回车
Email address我就直接空着回车了,密码就随便写个12345678a (太简单或者太短会提示你重新设置)
这里再开一个本地,输入指令启动一下项目
python .\manage.py runserver
打开网页
显示这个页面就就是启动成功了, 现在就 url 后面加上 /admin ,回车, 输入admin 和刚才设置的密码12345678a进入后台
可以看到只有Groups和Users 。我们把三个应用加进去。在三个应用中都有个admin.py ,都在里面注册一下模型。
在author应用中的admin.py里导入models
from django.contrib import admin
from author.models import *
admin.site.register(Author)
book
from django.contrib import admin
from book.models import *
admin.site.register(Book)
publisher
from django.contrib import admin
from publisher.models import *
admin.site.register(Publisher)
然后把网页刷新一下,可以看见添加进去了。
这里我们点击Author后面的add进行添加操作 张三@qq.com。输入完信息后点击save and add another保存并继续添加 李四 222@qq.com 、 王五333@qq.com 。注意这里的邮箱格式还是得正确填写。Gender性别就随意填选了。
在这添加作者信息保存的这一步的时候,我遇见了no such table: main.auth_user__old报错,原因是我的django版本2.0太老,而sqlite的版本要新一点,导致的bug,我更新了django版本到2.1.5。解决办法参考文章链接放在下面:
django报错:no such table: main.auth_user__old_django no such table-优快云博客
作者添加完后,我们回到admin首页,开始添加出版社,随便添加三个,这里我写了西安,成都,重庆
现在添加book,随便添加三本书,出版社我们按住CTRL可以多选。这里我写了 【半岛铁盒,张三,三个出版社】【西游记,李四,成都 重庆出版社】【青春咖啡馆,王五,西安 成都出版社】
路由url
数据添加完了,接着下一步。
首先,我们在author、book、publisher这三个软件包下,分别新建一个urls.py文件(三个都新建,名字都是urls.py),这里我截图展示一个。
djangoProject1下的urls.py 是主路由,三个应用下的urls.py是子路由。
先在主路由中去应用一下子路由。在主路由中,这里使用了namespace(命名空间)的方法。我们这样写(注释里写了需要实现的操作,方便之后看):
from django.contrib import admin
from django.urls import path, include
# 1.在书籍的book_index.html中有一个“查看所有书籍”的超链接按钮,点击进入书籍列表book_list.html页面
# 2.在书籍的book_list.html中显示所有书名,点击书名可以进入书籍详情book_detail.html(通过书籍id)
# 3.在书籍的book_detail.html中展示详情数据并且可以点击该书的作者和出版社,进入作者详情的author_detail.html和出版社详情的publisher_detail.html
urlpatterns = [
# 子路由,使用namespace
path('author/', include(('author.urls', 'author'), namespace='author')),
path('book/', include(('book.urls', 'book'), namespace='book')),
path('publisher/', include(('publisher.urls', 'publisher'), namespace='publisher')),
path('admin/', admin.site.urls),
]
然后在每个应用下的urls.py中写一下子路由。这里我只展示book的,另外两个的将代码中的book都改为author、publisher即可,其他代码全部一样。先把模块导进去(下方代码注释),下一步是写urlpatterns,但是现在还不能写,因为视图函数views还没有写,等views写完后在写urlpatterns。
from django.urls import path # 将主路由中的path导进来
from book.views import * # 要在urlpatterns中设置path绑定视图函数,所以需要将同应用下的视图函数也全部导入
urlpatterns = [
]
HTML模板
现在写HTML模板,在公共模板templates包下新建三个文件夹:author、book、publisher
根据要求里出现的html页面文件,右键文件夹新建html文件,【作者详情页;书籍详情页、书籍首页、书籍列表页;出版社详情页】我直接截图放在这里,HTML文件名字和我一样就行。(其实也可以分别在三个应用里新建一个templates去写模板,但是为什么要写在公共templates里呢,是因为这样可以将html代码全部放在一起,方便将前后端代码分开,看着整齐)。
HTML模板如下。五个HTML内容我们就先简单搭建一下,先全部写成一样的,<h2>标签里分别写文件对应的名字。上文中的【】里的名字。其他内容我们暂时不管,后面再添加。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h2>作者详情页</h2>
<hr>
</body>
</html>
views视图函数
现在来写三个应用的视图函数,首先写book的。因为book有3个html,对应三个不同页面,所以book的视图函数也写3个。在book/views.py中这样写(在book_detail中写上参数,不过目前我们还没有设置参数,但是我们也先写上bid,别的先不管。其他的视图函数需要写参数也是如此,先不管):
from django.shortcuts import render
# 书籍首页
def book_index(request):
return render(request, 'book/book_index.html') # render渲染函数
# 书籍列表
def book_list(request):
return render(request, 'book/book_list.html')
# 书籍详情,要写参数,bid是book的id,这里使用路由传参。
def book_detail(request, bid):
return render(request, 'book/book_detail.html')
再写author的视图函数。author/views.py下代码:
from django.shortcuts import render
# 作者详情
def author_detail(request, aid):
return render(request, 'author/author_detail.html')
然后写publisher的视图函数。publisher/view.py下代码:
from django.shortcuts import render
# 出版社详情
def publisher_detail(request, pid):
return render(request, 'publisher/publisher_detail.html')
子路由下的urlpatterns
上一步将视图函数写了,现在就要将子路由和对应的视图视图函数进行绑定。前面我们子路由只导了模块,现在把urlpatterns里的内容写进去。
author/urls.py(author只有一个视图函数,所以写一个path就行了):
urlpatterns = [
path('detail/<int:aid>/', author_detail, name='detail') # detail有参数,所以加了一个<int:aid>/
]
book/urls.py:
urlpatterns = [
path('index/', book_index, name='index'),
path('list/', book_list, name='list'),
path('detail/<int:bid>/', book_detail, name='detail'),
]
publisher/urls.py:
urlpatterns = [
path('detail/<int:pid>/', publisher_detail, name='detail'),
]
现在三个应用的路由 视图函数 模板 大体上写好了,那现在已经可以访问一下了,虽然还没有页面跳转,但是单独访问还是没问题的。如果你都流程和我一样,是没有问题的。如果报错请自行检查,复制你的报错信息百度都可以解决。现在运行项目。
你直接点这个本地网址是不行的,如下图所示,需要输入完整的url。
在上方输入完整的url,我们先看看作者详情页 localhost:8000/author/detail/1/ 。url后面加个1是因为前面我们加了参数,所以在这里需要随便写个数字传参,当然因为还没有设置参数所以数字随便写都是这个页面。你也可以看看.../book(publisher)/author/detail/1/去看看书籍(出版社)详情页,看书籍首页和列表页因为没有参数所以不需要在后面加参数:.../book/index(list)/ 即可。
可以看到都没有问题,路由啊视图函数这块都没有问题。
三、功能实现
# 1.在书籍的book_index.html中有一个“查看所有书籍”的超链接按钮,点击进入书籍列表book_list.html页面 # 2.在书籍的book_list.html中显示所有书名,点击书名可以进入书籍详情book_detail.html(通过书籍id) # 3.在书籍的book_detail.html中展示详情数据并且可以点击该书的作者和出版社,进入作者详情的author_detail.html和出版社详情的publisher_detail.html
功能1
在书籍的book_index.html中有一个“查看所有书籍”的超链接按钮,点击进入书籍列表book_list.html页面。
实现第一个要求,我们需要在book_index.html中写一个超链接(写在<hr>标签下方,注意缩进与上方相同)
<a href="{% url 'book:list' %}">查看所有书籍</a>
然后访问book/index/,可以看见已经有了。
这时我们点击超链接按钮,跳转到了书籍列表页。这就实现了要求的第一个功能。
功能2
在书籍的book_list.html中显示所有书名,点击书名可以进入书籍详情book_detail.html(通过书籍id)。
实现功能2,我们要在book_list中展示所有数据,那么这个数据在那里得到呢?这就需要去它绑定的视图函数里得到。打开book下的视图函数views.py。
首先把book.models导入一下:
from book.models import *
然后定义的书籍列表函数里,添加获取所有书籍数据的代码:
# 书籍列表
def book_list(request):
# 获取所有书籍数据
books = Book.objects.all() #这里使用all获取所有数据
return render(request, 'book/book_list.html', {'books': books}) #把books传进去
数据传过去了,现在需要在 book_list.html中展示(写在<hr>标签下方,注意缩进与上方相同)
<ul>
{% for book in books %}
<li>
<a href="{% url 'book:detail' book.id %}">
{{ book.title }}
</a>
</li>
{% endfor %}
</ul>
现在刷新book/list/页面
列表页已经出现了书籍数据,点击书籍即可跳转至书籍详情页,而且大家可以看到,跳转到详情页时,书籍id也传过来了,三本书对应的id就是1,2,3。功能第二步完成了。
功能3
在书籍的book_detail.html中展示详情数据并且可以点击该书的作者和出版社,进入作者详情的author_detail.html和出版社详情的publisher_detail.html
要在book_detail.html中展示书籍详情数据,我们需要去book的视图函数views里获取。在书籍详情函数里添加代码
# 书籍详情
def book_detail(request, bid):
# 获取bid对应的书籍
book = Book.objects.get(pk=bid)
return render(request, 'book/book_detail.html', {'book':book}) #把book传过去
然后在book_detail.html中写代码展示(写在<hr>标签下方,注意缩进与上方相同)
<p>书籍名称: {{ book.title }}</p>
<p>书籍出版时间: {{ book.publish_date }}</p>
<p>作者:
<a href="{% url 'author:detail' book.author.id %}">
{{ book.author.first_name }}{{ book.author.last_name }}
</a>
</p>
<p>出版社:
{% for publisher in book.publishers.all %}
<a href="{% url 'publisher:detail' publisher.id %}">
{{ publisher.name }}
</a>
{% if not forloop.last %}|{% endif %}
{% endfor %}
</p>
刷新一下网页,点击作者和出版社都可以跳转过至作者详情页和出版社详情页。
现在我们要让作者详情页author_detail.html展示数据。
需要在author的视图函数中获取数据。打开author的views.py。
导入author.models:
from author.models import *
在作者详情函数里,添加获取aid对应作者的代码:
# 作者详情
def author_detail(request, aid):
# 获取aid对应的作者
author = Author.objects.get(pk=aid)
return render(request, 'author/author_detail.html', {'author': author}) #把author传过去
然后打开作者详情页author_detail.html,将author/models.py里写的作者信息展示出来。(写在<hr>标签下方,注意缩进与上方相同。这里的性别gender我就直接显示Ture和False,如果要展示男女自己写一下判断就行)
<p>作者姓名: {{ author.first_name }}{{ author.last_name }}</p>
<p>作者邮箱: {{ author.email }}</p>
<p>作者性别: {{ author.gender }}</p>
现在刷新页面,点击作者就可以跳转到作者详情页看到作者信息了。
再让出版社详情页publisher_detail.html展示数据
和之前的步骤一样。打开publisher下的views.py。
导入publisher.models:
from publisher.models import *
在出版社详情函数里添加代码:
# 出版社详情
def publisher_detail(request, pid):
# 获取pid对应的出版社数据
publisher = Publisher.objects.get(pk=pid)
return render(request, 'publisher/publisher_detail.html',{'publisher':publisher})
然后在publisher_detail.html展示数据:(写在<hr>标签下方,注意缩进与上方相同)
<p>出版社名称: {{ publisher.name }}</p>
<p>出版社地址: {{ publisher.address }}</p>
<p>出版社城市: {{ publisher.city }}</p>
<p>出版社省份: {{ publisher.state_province }}</p>
<p>出版社国家: {{ publisher.country }}</p>
<p>出版社网址: {{ publisher.wbsite }}</p>
到目前,功能已经实现,不过我们这都是正向查询,如果我们需要方向查询呢?比如看出版社都出版了哪些书什么的,后续会编辑文章介绍。
四、结尾
django你们可以继续深入学习,了解更多的功能和玩法,包括前端的HTML页面的美化设计。本次django框架的管理系统的教程到此为止。这是一个简单基础的文章,希望可以帮助到需要学习的朋友。