python3第18章Django入门

Posted Q同码

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python3第18章Django入门相关的知识,希望对你有一定的参考价值。

A、建立项目

一、建立虚拟环境

在项目的目录下创建一个虚拟环境

python -m venv ll_env

技术图片

二、激活虚拟环境

source ll_env/bin/active

技术图片

三、安装Django

pip install django

注意:django(虚拟环境安装的django)仅在虚拟环境处于活动状态时才可以使用

四、在Django中安装项目

django-admin.py startproject learning_logs

技术图片

五、创建数据库

python manage.py migrate

技术图片

六、查看项目

python manage.py runserver

技术图片

B、创建应用程序

七、创建应用程序

python manage.py startapp learning_logs

技术图片

八、定义模型

CharField-由字符和文本组成的数据

DateTimeField-记录日期和时间的数据

其他字段类型参考https://docs.djangoproject.com/en/1.8/ref/models/fields/

models.py
from django.db import models
 
# Create your models here.
 
 
class Topic(models.Model):
    """用户学习的主题"""
    text = models.CharField(max_length=200)
    date_added = models.DateTimeField(auto_now_add=True)
 
    def __str__(self):
        """返回模型的字符串表示"""
        return self.text

Django调用方法__str__()来显示模型的简单表示。在这里,我们编写__str__(),它返回存储在属性text中的字符串。

九、激活模型

settings.py
INSTALLED_APPS = (
    ‘django.contrib.admin‘,
    ‘django.contrib.auth‘,
    ‘django.contrib.contenttypes‘,
    ‘django.contrib.sessions‘,
    ‘django.contrib.messages‘,
    ‘django.contrib.staticfiles‘,
 
    # My apps
    ‘learning_logs‘,
)

 

python manage.py makemigrations learning_logs

技术图片

命令makemigrations让Django确定该如何修改数据库,使其能够存储与我们定义的新模型相关联的数据。输出表明Django创建一个名为0001_initial.py的迁移文件,这个文件将在数据库中为模型Topic创建一个表。

python manage.py migrate

技术图片

这个命令的大部分输出都与我们首次执行命令migrate的输出相同。我们需要检查的是图中最后一行的输出行。在这里,Django确认learning_logs应用迁移时一切正常。

注意:每当修改项目的数据时,都采取一下三个步骤:

1、修改models.py

2、对文件(这里是learning_logs)调用makemigrations

3、让Django迁移项目

C、Django管理网站

十、创建超级用户

python manage.py createsuperuser

技术图片

Django并不会存储输入的密码,而存储从该密码派生出来的一个字符串——散列值。每当输入密码时,Django都计算其散列值,并将结果与存储的散列值进行计较。通过存储散列值,即便黑客获得了网站数据库的访问权,也只能获取其中存储的散列值,而无法获得密码。在网站配置正确的情况下,几乎无法根据散列值推导出原始密码。

 

十一、向管理网站注册模型

admin.py
from django.contrib import admin
from learning_logs.models import Topic
 
# Register your models here.
 
admin.site.register(Topic)  # 让Django通过管理网站管理我们的模型

访问runserver地址(可以指定端口),输入刚刚创建的超级用户的用户名和密码。

技术图片

十二、添加主题

点击“add”

技术图片

进入添加新主题的表单,输入“chess”,单击“Save”

技术图片

查看添加的topic

技术图片

D、定义模型Entry

十三、创建模Entry

第一个属性topic是一个ForeignKey实例。外键是一个数据库术语,它引用了数据库中的另一条记录;这些代码将每个条目关联到特定的主题。每个主题创建时,都给他分配一个键(或ID)

。需要在俩项数据之间建立联系时,Django使用与每项信息相关联的键。

models.py
class Entry(models.Model):
    """学到的有关某个主题的具体知识"""
    topic = models.ForeignKey(Topic, on_delete=models.CASCADE)
    text = models.TextField()
    date_added = models.DateTimeField(auto_now_add=True)
 
    class Meta:
        # Meta存储用于管理模型的额外信息,在这里,它让我们能够设置一个特殊属性,让Django在需要时使用entries来表示多个条目
        verbose_name_plural = ‘entries‘
 
    def __str__(self):
        """返回模型中的字符串表示"""
        return self.text[:50]+‘...‘  # 只显示前50个字符

十四、迁移模Entry

python manage.py makemigrations learning_logs
python manage.py migrate

技术图片

十五、向管理网站注册Entry

admin.py
from django.contrib import admin
from learning_logs.models import Topic, Entry
 
# Register your models here.
 
admin.site.register(Topic)
admin.site.register(Entry)

十六、添加一个条目

点击Entry的“add”

技术图片

选择主题创建条目

技术图片

保存信息

技术图片

E、Django Shell

十七、交互式shell会话

python manage.py shell

技术图片

技术图片

注意:每次修改模型后,都需要重启shell,这样才能看到修改的效果。要退出shell会话,可按Ctr+D;如果是windows系统,应按Ctr+Z,再按回车。

F、创建网页:学习笔记主页

十八、映射URL

在learning_log文件夹下的urls.py中添加一行代码来包含模块learning_logs.urls。这行代码包含实参namespace,让我们能够将learning_logs的URL同项目中的其他URL区分开来。

urls.py
from django.contrib import admin
from django.urls import path
from django.conf.urls import include, url
 
urlpatterns = [
    path(‘admin/‘, admin.site.urls),
    url(r‘‘, include((‘learning_logs.urls‘, ‘learning_logs‘), namespace=‘learning_logs‘)),
]

在learning_logs中创建一个urls.py

urls.py
"""定义learning_logs的URL模式"""
 
from django.conf.urls import url
from import views
 
 
urlpatterns = [
    # 主页
    url(r‘^$‘, views.index, name=‘index‘),
]

十九、编写视图

views.py
from django.shortcuts import render
 
# Create your views here.
 
 
def index(request):
    """学习笔记的主页"""
    return render(request, ‘learning_logs/index.html‘)

二十、编写模版

在leaning_logs中创建一个文件夹templates,在里面创建一个learning_logs文件夹,新建一个文件,并将其命名为index.html

index.html
<p>Learning Logs</p>
<p>Learning Log helps you keep track of your learning, for any topic you‘re learning about.</p>

G、创建其他网页

二十一、模版继承-父模版

base.html
<p>
    <a href="{% url ‘learning_logs:index‘ %}">Learning Log</a>
</p>
 
{% block content %}{% endblock content %}

二十一、模版继承-子模版

重新编写index.html

index.html
{% extends "learning_logs/base.html" %}
 
{% block content %}
    <p>Learning Log helps you keep track of your learning, for any topic you‘re learning about.</p>
{% endblock %}

二十一、显示所有主题的页面

修改learning_logs/urls.py文件

urls.py
"""定义learning_logs的URL模式"""
 
from django.conf.urls import url
from import views
 
 
urlpatterns = [
    # 主页
    url(r‘^$‘, views.index, name=‘index‘),
     
    # 显示所有的主题
    url(r‘^topics/$‘, views.topics, name=‘topics‘)
]

在views.py中添加代码

views.py
from django.shortcuts import render
from .models import Topic
 
# Create your views here.
 
 
def index(request):
    """学习笔记的主页"""
    return render(request, ‘learning_logs/index.html‘)
 
 
def topics(request):
    """显示所有的主题"""
    topics = Topic.objects.order_by(‘date_added‘)
    context = {‘topics‘: topics}
    return render(request, ‘learning_logs/topics.html‘, context)

创建显示所有主题的页面的模版

topics.html
{% extends "learning_logs/base.html" %}
 
{% block content %}
    <p>Topics</p>
    <ul>
    {% for topic in topics %}
        <li>{{ topic }}</li>
    {% empty %}
        <li>No topics have been added yet.</li>
    {% endfor %}
    </ul>
{% endblock content %}

修改父模版,使其包含到显示所有主题的页面的链接

base.html
<p>
    <a href="{% url ‘learning_logs:index‘ %}">Learning Log</a>
</p>
 
{% block content %}{% endblock content %}

技术图片

H、显示特定主题的页面

二十二、URL模式

创建一个专注于特定主题的页面——显示该主题的名称及该主题的所有条目。修改learning_logs/urls.py文件

urls.py
"""定义learning_logs的URL模式"""
 
from django.conf.urls import url
from import views
 
 
urlpatterns = [
    # 主页
    url(r‘^$‘, views.index, name=‘index‘),
 
    # 显示所有的主题
    url(r‘^topics/$‘, views.topics, name=‘topics‘),
 
    # 特定主题的详细页面
    url(r‘^topics/(?P<topic_id>d+)/$‘, views.topic, name=‘topic‘),
]

正则表达式:r‘^topics/(?P<topic_id>d+)‘

r让Django将这个字符串视为原始字符串,并指出正则表达式包含在引号内。/(?P<topic_id>d+)/与包含在俩个斜杠内的整数匹配,并将这个整数存储在一个名为topic_id的实参中。这部分表达式俩边的括号捕获URL中的值;?<topic_id>将匹配的值存储到topic_id中;而表达式d+与包含在俩个斜杠内的任何数字都匹配,不管这个数字为多少位。

二十三、视图

函数topic()需要从数据库中获取指定的主题以及与之相关联的所有条目。

views.py
def topic(request, topic_id):
    """显示单个主题及其所有的条目"""
    topic = Topic.objects.get(id=topic_id)
    entries = topic.entry_set.order_by(‘-date_added‘)
    context = {‘topic‘ : topic, ‘entries‘: entries}
    return render(request, ‘learning_logs/topic.html‘, context)

这个函数接受正则表达式?<topic_id>d+捕获的值,并将其存储到topic_id中。date_add前面的减号指定按降序排序。

二十三、模板

topic.html
{% extends "learning_logs/base.html" %}
 
{% block content %}
    <p>Topic: {{ topic }}</p>
    <p>Entries:</p>
    <ul>
    {% for entry in entries %}
        <li>
            <p>{{ entry.date_added |date:‘M d,Y H:i‘ }}</p>
            <p>{{ entry.text|linebreaks }}</p>
        </li>
    {% empty %}
        <li>
            There are no entries for this topic yet.
        </li>
    {% endfor %}
    </ul>
{% endblock content %}

每个项目列表都将列出两项信息:条目的时间戳和完整的文本。为列出时间戳,我们显示属性date_added的值。在Django模版中,竖线(|)表示模版过滤器——对模版变量的值进行修改的函数。过滤器date:‘M d,Y H:i‘以这样的格式显示时间戳。接下来一行显示text完整值,而不仅仅是entry的前50个字符。过滤器linebreaks将包含换行符的长条目转换为浏览器能够理解的格式,以免显示为一个不间断的文本块。

二十四、将显示所有主题的页面中的每个主题都设置为链接

topics.html
{% extends "learning_logs/base.html" %}
 
{% block content %}
    <p>Topics</p>
    <ul>
    {% for topic in topics %}
        <li>
            <a href="{% url ‘learning_logs:topic‘ topic.id %}">{{ topic }}</a>
        </li>
    {% empty %}
        <li>No topics have been added yet.</li>
    {% endfor %}
    </ul>
{% endblock content %}

技术图片

以上是关于python3第18章Django入门的主要内容,如果未能解决你的问题,请参考以下文章

Django入门与实践 1-16章总结

Django入门与实践-第21章:迁移(完结)

python3第19章用户账户

Django入门与实践-第22章:基于类的视图

Django入门与实践-第12章:复用模板(完结)

Unity Shader入门精要学习笔记 - 第5章 开始 Unity Shader 学习之旅