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/:


python Web应用程序1 2021-03-02_第1张图片
一切正常

创建应用程序:

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


激活模型:


python Web应用程序1 2021-03-02_第2张图片
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: [email protected]

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/,输入超级账号

python Web应用程序1 2021-03-02_第3张图片
超级账号


python Web应用程序1 2021-03-02_第4张图片
包含模型Topic的管理网站

3.添加主题


python Web应用程序1 2021-03-02_第5张图片
添加主题

定义模型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)



python Web应用程序1 2021-03-02_第6张图片
描述


python Web应用程序1 2021-03-02_第7张图片
三个条目

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)的列表

, ]>


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

>>> from learning_logs.models import Topic

>>> Topic.objects.all()

, ]>

>>> 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=)


#查看相关联的条目

>>> t.entry_set.all()

,

Chinese and countries w...>]>

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

你可能感兴趣的:(python Web应用程序1 2021-03-02)