Python之Django框架:搭建一个简单管理系统

目录

一、前言

二、创建Django项目

文件功能简介

三、项目配置文件

settings文件功能简单介绍及配置

配置三个app模型

数据库

路由url

HTML模板

views视图函数

子路由下的urlpatterns

三、功能实现

功能1

功能2

功能3

四、结尾


一、前言

最近也在学习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框架的管理系统的教程到此为止。这是一个简单基础的文章,希望可以帮助到需要学习的朋友。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值