如何使用python之django创建应用程序

一、创建应用程序

Django项目由一系列应用程序组成,它们协同工作让项目成为一个整体。
首先激活虚拟环境,并执行命令startapp,操作如下:

learning_log$  source ll_env/bin/activate
(ll_env)learning_log$ python manage.py startapp learning_logs
(ll_env)learning_log$ ls
db.sqlite3 learning_log learning_logs ll_env
(ll_env)learning_log$ ls learnings
__init__.py admin.py apps.py models.py migrations tests.py views.py

创建应用程序生成的文件及含义:
admin.py 文件与网站的后台管理站点配置相关
apps.py文件用于配置当前子应用的相关信息
migrations 目录用于存放数据库迁移历史文件
tests.py文件开发测试用例,编写单元测试
views.py文件用于编写web应用视图
models.py 文件用于保存数据库模型类

1、定义模型

1)打开文件models.py,看看它当前包含哪些内容:
在这里插入图片描述
这里导入了models,并让我们创建自己的模型,模型将告诉Django如何处理应用程序中存储的数据。在代码层面,模型就是一个类,包含属性和方法。

from django.db import models

class Topic(models.Model):
    """ 用户学习的主题 """
    text = models.CharField(max_length=200)
    date_added = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        """ 返回模型的字符串表示 """
        return self.text

2)这里我们创建了一个名为Topic的类,它继承类Model,即Django中定义模型基本功能的类,并添加了两个属性:text和date_added
a、属性text是一个CharField——由字符组成的数据,即文本。需要存储少量的文本,如标题、城市···时,可以使用CharField。定义CharField属性时,必须告诉Django该数据库中预留多少空间,这里将max_length设置成了200(200个字符),此时存储主题基本够用。
b、属性date_added是一个DateTimeField——记录日期和时间的数据。 我们传递了实参auto_now_add=True,每当用户创建新主题时,Django都会将这个属性自动设置为当前日期和时间
c、Django调用方法__str__()来显示模型的简单表示。这里编写了方法__str__(),它返回存储在属性text中的字符串。

2、激活模型

1)要使用这些模型,必须让django将前面创建的应用程序包含到项目中。在setting.py有个片段告诉django哪些应用程序被安装到了项目中并将协同工作。下面将我们的项目(learning_logs)添加到INSTALLED_APPS中,如下图:
在这里插入图片描述
注意:务必将自己创建的应用程序放在默认应用程序前面,这样就能覆盖默认应用程序的行为。
2)接下来需要让django修改数据库,使其能够存储与模型Topic相关的信息。为此,在终端执行下面的命令:

(ll_env)learning_log$ python manage.py makemigrations learning_logs(应用程序名称)
//命令makemigrations让django确定该如何修改数据库,使其能够存储与前面定义的新模型相关联的数据。
(ll_env)learning_log$ python manage.py migrate

每当我们修改应用程序管理的数据时,都采取以下三个步骤:
1、修改models.py文件
2、对应用程序调用makemigrations
3、让django迁移项目(migrate)

3、Django管理网站

Django提供的管理网站(admin site)让我们能够轻松的处理模型。网站管理员可以使用管理网站,但普通用户则无法使用。
1)创建超级用户

(ll_env)learning_log$ python manage.py createsuperuser
Username (leave blank to use 'eric'): ll_admin
Email address:
Password:
Password(again):
Superuser created successfully.
 (ll_env)learning_log$

当执行命令createsuperuser时,Django提示输入超级用户的用户名,以及两次密码

一些敏感信息可能会向网站管理员隐藏,例如,Django并不存储我们输入的密码,二十存储从该密码派生出来的一个字符串,称为散列值。每当输入密码时,Django都计算其散列值,并将结果与存储的散列值进行比较。如果这两个散列值相同,就是通过了身份验证。由于存储的是散列值,即使黑客获得了网站数据库的访问权,也只能获取其中存储的散列值,无法获得密码,在网站配置正确的情况下,几乎无法根据散列值推导出原始密码。

2)向管理网站注册模型
django自动在管理网站中添加了一些模型,如User和Group,但对于我们创建的模型,必须使用手工进行注册。我们在创建应用程序时,Django在models.py所在的目录中创建了一个名为admin.py的文件:

from django.contrib import admin

# Register your models here.

from .models import Topic

admin.site.register(Topic)

现在打开浏览器访问http://127.0.0.1:8000/admin/,并输入创建的超级用户名及密码。将看到如下的页面:
在这里插入图片描述

如果浏览器中看到一条信息,指出访问的网页不可用,请确认在终端窗口中运行这点Django服务器。如果没有,请激活虚拟环境,并执行命令python manage,py runserver。在开发过程中,如果无法通过浏览器访问项目,首先应采用的故障排除措施是,关闭所有打开的终端,再打开终端并执行命令runserver。
3)添加主题
向管理网站注册Topic后,我们来添加第一个追主题,创建内容可根据自己感兴趣的方向填写,比如下图所示:
在这里插入图片描述

4、定义模型Entry

要记录学习的知识,我们必须能够再学习笔记中添加条目。为此,需要定义相关的模型、每个条目都与特定的主题相关联,这种关系称为多对一关系,即多个条目可关联到同一个主题。下面是模型Entry的代码,我们将这些代码放在文件models.py中:

class Entry(models.Model):
    """ 学到的有关某个主题的具体知识 """
    topic = models.ForeignKey(Topic, on_delete=models.CASCADE)
    text = models.TextField()
    text_added = models.DateTimeField(auto_now_add=True)

    class Meta:
        verbose_name_plural = 'entries'

    def __str__(self):
        """ 返回模型的字符串表示 """
        return f"{self.text[:50]}..."

Entry继承了Django的基类Model,类属性如下:
1)第一个属性topic 是个ForeignKey(外键)实例,实参on_delete=models.CASCADE让Django在删除主题(topic)的同时删除所有与之关联的所有条目(entry),这称为级联删除
2)第二个属性text ,他是一个TextField实例。这种字段长度不受限制,因为我们不想限制条目的长度。
3)属性text_added 让我们能够按照创建顺序呈现条目,并在每个条目旁边放置时间戳
方法__str__()告诉django,呈现条目时应展示哪些信息,条目包含的文本可能很长,因此让django只显示text的前50个字符,我们还添加了一个省略号,指出显示的并非整个条目。

5、迁移模型Entry

添加新模型后,需要再次迁移数据库,我们将慢慢的对这个过程了如指掌:修改models.py并执命令python manage.py makemigrations app_name,在执行命令python manage.py migrate。生成一个新的迁移文件0002_entry.py,内容如下:
在这里插入图片描述

6、向管理网站注册Entry

我们还需要注册模型entry。为此,需要将admin.py修改成类似下面这样:

from django.contrib import admin

# Register your models here.

from .models import Topic, Entry
#
admin.site.register(Topic)
admin.site.register(Entry)

返回到http://127.0.0.1:8000/admin/,将看到LEARNING_LOGS下列出了Entry,如下图:
在这里插入图片描述

7、Django shell

输入一些数据后,就可通过交互式终端会话以编程方式查看这些数据了、这种交互式环境称为Django shell,是测试项目和排除故障的理想之地。下面是一个交互式shell会话示例:

(ll_env)learning_log$ python manage.py shell
Python 3.9.6 (tags/v3.9.6:db3ff76, Jun 28 2021, 15:26:21) [MSC v.1929 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from learning_logs.models import Topic
>>> Topic.objects.all()
<QuerySet [<Topic: 希言学习jango创建网站的第一个主题>, <Topic: 练习项目>]>
>>>

在活动状态的虚拟环境中执行时,命令python manage.py shell 启动python解释器,让我们能够探索存储在项目数据库中的数据,这里导入了模块learning_logs.models中的模型Topic,再使用方法Topic.objects.all()获取模型Topic的所有实例,这将返回一个称为==查询集(queryset)==的列表。
可以像遍历列表一样遍历查询集。下面演示了如何查看分配给每个主题对象的ID:

>>> topics = Topic.objects.all()
>>> for topic in topics:
...     print(topic.id, topic)
...
1 希言学习jango创建网站的第一个主题
5 练习项目
>>>

将返回的查询集存储再topics中,再打印每个主题的id属性和字符串表示。从输出可知,主题‘练习项目’的ID 为5。
知道了主题对象的ID 后,就可使用方法Topic.objects.get()获取该对象并查看其属性。下面我们看看主题的属性text和date_added的值:

>>> t = Topic.objects.get(id=5)
>>> t.text
'练习项目'
>>> t.date_added
datetime.datetime(2023, 3, 23, 14, 11, 33, 449674, tzinfo=datetime.timezone.utc)
>>>

我们还可以查看与主题相关联的条目,前面给模型Entry定义了属性topic。这是一个Foreignkey,将条目与主题关联起来。利用这种关联关系,django能够获取与特定主题相关联的所有条目,如下所示:

>>> t.entry_set.all()
<QuerySet [<Entry: 练习项目的把内容...>]>
>>>

注意:
每次修改模型后,都需要重启shell,这样才能看到修改的效果。要退出shell会话,可按ctrl+C,或者quit()退出shell.

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值