python Web应用程序1 2021-03-02

Django是一个web框架

在Django中创建项目:

#创建项目 末尾句点让新项目使用合适的目录结构

PS C:\Users\hp\Desktop\learning_log> django-admin startproject learning_log .

#dir查看文件信息

PS C:\Users\hp\Desktop\learning_log> dir

    目录: C:\Users\hp\Desktop\learning_log

Mode                LastWriteTime        Length Name                                                           

----                -------------        ------ ----                                                           

d-----        2021/3/1    14:11                .vscode                                                         

d-----        2021/3/1    14:17                learning_log                                                   

-a----        2021/3/1    14:17            690 manage.py                                                       

PS C:\Users\hp\Desktop\learning_log> dir learning_log

    目录: C:\Users\hp\Desktop\learning_log\learning_log

Mode                LastWriteTime        Length Name

----                -------------        ------ ----

-a----        2021/3/1    14:17            417 asgi.py

-a----        2021/3/1    14:17          3200 settings.py    #指定Django如何与系统交互以及如何管理项目

-a----        2021/3/1    14:17            775 urls.py    #应该创建哪些页面来响应浏览器请求

-a----        2021/3/1    14:17            417 wsgi.py    #帮助Django提供它创建的文件

-a----        2021/3/1    14:17              0 __init__.py

创建数据库:

#迁移migrate,首次执行让django确保数据库与项目的当前状态匹配.使用SQLite中,首次将新建数据库

PS C:\Users\hp\Desktop\learning_log> python manage.py migrate

Operations to perform:    #指出它将准备好数据库,用于存储执行管理和身份验证任务所需的信息

  Apply all migrations: admin, auth, contenttypes, sessions

Running migrations:

  Applying contenttypes.0001_initial... OK

  Applying auth.0001_initial... OK

  Applying admin.0001_initial... OK

  Applying admin.0002_logentry_remove_auto_add... OK

  Applying admin.0003_logentry_add_action_flag_choices... OK

  Applying contenttypes.0002_remove_content_type_name... OK

  Applying auth.0002_alter_permission_name_max_length... OK

  Applying auth.0003_alter_user_email_max_length... OK

  Applying auth.0004_alter_user_username_opts... OK

  Applying auth.0005_alter_user_last_login_null... OK

  Applying auth.0006_require_contenttypes_0002... OK

  Applying auth.0007_alter_validators_add_error_messages... OK

  Applying auth.0008_alter_user_username_max_length... OK

  Applying auth.0009_alter_user_last_name_max_length... OK

  Applying auth.0010_alter_group_name_max_length... OK

  Applying auth.0011_update_proxy_permissions... OK

  Applying auth.0012_alter_user_first_name_max_length... OK

  Applying sessions.0001_initial... OK


#SQLite是一种使用单个文件的数据库,是编写简单应用程序的理想选择,因为它让你不用太关注数据库管理的问题

PS C:\Users\hp\Desktop\learning_log> dir

    目录: C:\Users\hp\Desktop\learning_log

Mode                LastWriteTime        Length Name

----                -------------        ------ ----

d-----        2021/3/1    14:11                .vscode

d-----        2021/3/1    14:33                learning_log

-a----        2021/3/1    14:33        131072 db.sqlite3    #创建了一个文件db.sqlite3

-a----        2021/3/1    14:17            690 manage.py


查看项目:

#使用命令runserver查看项目状态

PS C:\Users\hp\Desktop\learning_log> python manage.py runserver

Watching for file changes with StatReloader

Performing system checks...

System check identified no issues (0 silenced).    #通过检查确认正确创建了项目

March 01, 2021 - 14:59:15

Django version 3.1.7, using settings 'learning_log.settings'    #指出Django的版本以及当前使用的设置文件名称

Starting development server at http://127.0.0.1:8000/    #指出项目的URL 在当前系统端口8000上侦听请求

Quit the server with CTRL-BREAK.


浏览器中输入http://localhost:8000/:


一切正常

创建应用程序:

PS C:\Users\hp\Desktop\learning_log> python manage.py startapp learning_logs    #新建learning_logs

PS C:\Users\hp\Desktop\learning_log> dir learning_logs

    目录: C:\Users\hp\Desktop\learning_log\learning_logs

Mode                LastWriteTime        Length Name

----                -------------        ------ ----

d-----        2021/3/1    15:39                migrations

-a----        2021/3/1    15:39            66 admin.py

-a----        2021/3/1    15:39            105 apps.py

-a----        2021/3/1    15:39            60 models.py    #定义要在应用程序中管理的数据

-a----        2021/3/1    15:39            63 tests.py

-a----        2021/3/1    15:39            66 views.py

-a----        2021/3/1    15:39              0 __init__.py


定义模型:

#每当需要修改"学习笔记"管理的数据时,都采取如下三个步骤:修改models.py,对learning_logs调用makemigrations,以及让Django迁移项目

①创建/修改models.py

from django.db import models

# 在这里创建模型

class Topic(models.Model):  # 继承Model

    '''用户学习的主题'''

    # text是一个由CharField--由字符串组成的数据,即文本

    # 需要存储少量文本,如名称、标题或城市,预留200字符的空间

    text = models.CharField(max_length=200)

    # 是一个DateTimeField--记录日期和时间的数据

    # auto_now_add=True,每当用户创建新主题时,Django会自动设置为当前日期和时间

    date_added = models.DateTimeField(auto_now_add=True)

    def __str__(self):

        '''返回模型的字符串表示'''

        # 显示主题的信息

        return self.text


激活模型:


learning_log中settings.py

将INSTALLED_APP修改成:

INSTALLED_APPS = [

    'learning_logs',

    # 默认添加的应用程序

    'django.contrib.admin',

    'django.contrib.auth',

    'django.contrib.contenttypes',

    'django.contrib.sessions',

    'django.contrib.messages',

    'django.contrib.staticfiles',

]

#接下来让Django修改数据库,使其能够存储于模型Topic相关信息

②对learning_logs调用makemigrations

PS C:\Users\hp\Desktop\learning_log> python manage.py makemigrations learning_logs

Migrations for 'learning_logs':

  learning_logs\migrations\0001_initial.py

    - Create model Topic

#命令makemigrations让Django确定该如何修改数据库,使其能够存储与前面定义的新模型相关联的数据

#输出表明Django创建了一个名为0001_initial.py的迁移文件,这个文件将在数据库中为模型Topic创建一个表

③Django迁移项目

#下面应用这种迁移,让Django替我们修改数据库

PS C:\Users\hp\Desktop\1> python manage.py migrate

Operations to perform:

  Apply all migrations: admin, auth, contenttypes, learning_logs, sessions

Running migrations:

  Applying learning_logs.0001_initial... OK    #应用迁移时正常



Django管理网站:

1.创建超级用户

PS C:\Users\hp\Desktop\learning_log> python manage.py createsuperuser

Username (leave blank to use 'hp'): 11_admin

Email address: 349050532@qq.com

Password:

Password (again):

Error: Your passwords didn't match.

2.向管理网站注册模型

#learning_logs中admin.py

from django.contrib import admin

from .models import Topic  # 导入要注册的模型Topic

admin.site.register(Topic)  # 让Django通过管理网站管理模型


登入网址http://localhost:8000/admin/login/?next=/admin/,输入超级账号

超级账号


包含模型Topic的管理网站

3.添加主题


添加主题

定义模型Entry:

多对一关系:每个条目都与特定主题相关联,多个条目可关联到同一个主题

from django.db import models

# 在这里创建模型

class Topic(models.Model):  # 继承Model

    '''用户学习的主题'''

    # text是一个由CharField--由字符串组成的数据,即文本

    # 需要存储少量文本,如名称、标题或城市,预留200字符的空间

    text = models.CharField(max_length=200)

    # 是一个DateTimeField--记录日期和时间的数据

    # auto_now_add=True,每当用户创建新主题时,Django会自动设置为当前日期和时间

    date_added = models.DateTimeField(auto_now_add=True)

    def __str__(self):

        '''返回模型的字符串表示'''

        # 显示主题的信息

        return self.text

class Entry(models.Model):

    '''学习的有关某个主题的具体知识'''

    # 外键,指向数据库中的另一台记录,这里将每个条目关联到特定主题

    # 创建主题时,都分配了一个键(ID),需要在两项数据之间建立联系时,使用相关联键

    #on_delete=models.CASCADE在删除主题的同时 删除所有与之相关联的条目,级联删除

    topic = models.ForeignKey(Topic, on_delete=models.CASCADE)

    #字段长度不受限制

    text = models.TextField()

    #按创建顺序呈现条目,并在每个条目旁放置时间戳

    date_added = models.DateTimeField(auto_now_add=True)

    #Meta存储用于管理模型的额外信息

    class Meta:

        #设置特殊属性,让Django在需要时使用Entries来表示多个条目

        #如果没有这个类,Django将使用Entrys来表示多个条目

        verbose_name_plural = 'entries'

    def __str__(self):

        '''返回模型的字符串表示'''

        return f"{self.text[:50]}..."

迁移模型:

PS C:\Users\hp\Desktop\learning_log> python manage.py makemigrations learning_logs

#生成新的迁移文件,告诉Django如何修改数据库,使其能够存储与模型Entry相关信息

Migrations for 'learning_logs':

  learning_logs\migrations\0002_entry.py    

    - Create model Entry

PS C:\Users\hp\Desktop\learning_log> python manage.py migrate   

Operations to perform:

  Apply all migrations: admin, auth, contenttypes, learning_logs, sessions

Running migrations:

  Applying learning_logs.0002_entry... OK    #迁移顺利


向管理网站注册Entry:

修改admin.py:

from django.contrib import admin

from .models import Topic, Entry  # 导入要注册的模型Topic,Entry

admin.site.register(Topic)  # 让Django通过管理网站管理模型

admin.site.register(Entry)



描述


三个条目

Django shell:

#输入数据,通过交互式终端会话以编程方式查看这些数据

PS C:\Users\hp\Desktop\learning_log> python manage.py shell

Python 3.9.0 (tags/v3.9.0:9cf6752, Oct  5 2020, 15:34:40) [MSC v.1927 64 bit (AMD64)] on win32

Type "help", "copyright", "credits" or "license" for more information.

(InteractiveConsole)

>>> from learning_logs.models import Topic    #导入模块Topic

>>> Topic.objects.all()    #获取所有实例,这将返回一个查询集(queryset)的列表

<QuerySet [<Topic: Chess>, <Topic: Rock Climbing>]>


#可以像遍历列表一样遍历查询集,查看分配给每个主题对象的ID:

>>> from learning_logs.models import Topic

>>> Topic.objects.all()

<QuerySet [<Topic: Chess>, <Topic: Rock Climbing>]>

>>> topics = Topic.objects.all()

>>> for topic in topics:       

...    print(topic.id,topic)

...

1 Chess

2 Rock Climbing


#知道主题对象的ID后,就可使用方法Topic.objects.get()获取该对象并查看其属性

>>> t=Topic.objects.get(id=1)

>>> t.text

'Chess'

>>> t.date_added

datetime.datetime(2021, 3, 1, 8, 54, 20, 684484, tzinfo=<UTC>)


#查看相关联的条目

>>> t.entry_set.all()

<QuerySet [<Entry: Chinese chess is a kind of chess game originated i...>, <Entry: Chess is mainly popular in

Chinese and countries w...>]>

#假如有模型Pizza,Topping.Topping通过外键关联到Pizza,如果有一个名为my_pizza的Pizza对象,就可使用代码my_pizza.topping_set.all()来获取披萨的所有配料

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,491评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,856评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,745评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,196评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,073评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,112评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,531评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,215评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,485评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,578评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,356评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,215评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,583评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,898评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,497评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,697评论 2 335