今天开始就是本书的最后一个项目:Web应用程序,我也在思索这本书看完之后,接下来看什么。

目前有三种选择:

1、看书《利用Python》进行数据分析

2、跟着GitHub的100天从小白到大神的教程做

3、跟着bilibili黑马编程或其他编程的课程中

这三种各有利弊:

第一种的话,因为是bilibili的UP主致敬大神在走的,那么我跟着她走,搭配她的学习笔记会比较顺畅。毕竟第一本书入门都是一样的。但缺点是缺少视频课程,一旦有不懂的地方,很难找到能答疑的视频。

第二种的话会比较全面,加上这个项目的GitHub上Python项目里排名第三的,想必一定非常优秀了。但缺点跟第一种类似,也是缺少视频教程。而且因为我不是从0开始走的,所以知识点可能会有偏差。

第三种跟第二种类似,全面,还有视频,但是依然不是从0跟着课程开始走的,知识点有偏差。

所以目前还是比较偏向第一种吧。

好了,废话不多说,我们先开始今天的学习吧。

18.1 建立项目
本章的主要内容是使用Django来制作一个学习笔记项目。

18.1.1 制定规范
我们要编写一个名为“学习笔记”的Web应用程序,让用户能够记录感兴趣的主题,并在学习每个主题的过程中添加日志条目。“学习笔记”的主页对这个网站进行描述,并邀请用户注册或登录。用户登陆后,可以创建新主题、添加新条目以及阅读既有的条目。
18.1.2 建立虚拟环境
在终端内输入:
python3 -m venv ii_env

创建一个名为ii_env的虚拟环境。

18.1.3 激活虚拟环境
source ii_env/bin/activate

停止虚拟环境
deactivate
18.1.4 安装Django
pip3 install django 

Django仅在虚拟环境ii_env处于活动状态时才可用
18.1.5 在Django中创建项目
1.django-admin startproject learning_log .
2.ls
3.ls learning_log

1.让Django创建一个名为learning_log的项目。
2.运行ls,结果表明Django新建了一个名为learning_log的目录。
3.目录包含四个文件:
(1)settings:指定Django如何与系统交互以及如何管理项目。
(2)urls:告诉Django应创建那些页面来响应浏览器请求。
(3)wsgi:帮助Django提供它创建的文件,这个文件名是WEB服务器网管接口的首字母缩写。
18.1.6 创建数据库
python manage.py migrate


18.1.7 查看项目
python manage.py runserver

18.2 创建应用程序
新建一个窗口,重新激活虚拟环境:
source ii_env/bin/activate
python manage.py startapp learning_logs
ls
ls learning_logs/
18.2.1 定义模型
打开models.py(位置在learning_logs/migrations/models.py)


from django.db import models

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

    def __str__(self):
        """返回模型的字符串表示"""
        return self.text
18.2.2 激活模型
在learning_log下的settings.py中修改:
INSTALLED_APPS = [
    # 我的应用程序
    'learning_logs',

    # 默认添加的应用程序
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

终端执行下面的命令:
python manage.py makemigrations learning_logs
python manage.py migrate
18.2.3 Django 管理网站
1.创建超级用户
python manage.py createsuperuser
Username (leave blank to use 'grefory_mac'): ii_admin
Email address: 
Password: 
Password (again): 
Superuser created successfully.

2.向管理网站注册模型
在admin.py进行修改
from django.contrib import admin

# Register your models here.
from .models import Topic

admin.site.register(Topic)

3.添加主题
这一部分按照书中的思路走会出问题,不过建议先走一遍,万一成功了呢?
没成功的话,请看这篇文章:
https://blog.csdn.net/bubblesumm/article/details/103208409
18.2.4 定义模型Entry
from django.db import models

# Create your models here.
class Topic(models.Model):
    """用户学习的主题"""
    text = models.CharField(max_length=200,blank=True,default='')
    date_added = models.DateTimeField(auto_now_add=True)

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

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:
        verbose_name_plural = 'entries'
    
    def __str__(self):
        """返回模型的字符串表示"""
        return f"{self.text[:50]}..."
18.2.5 迁移模型Entry
迁移三部曲:
1、修改models.py
2、迁移命令:python manage.py makemigrations learning_logs
3、查看迁移是否顺利:python manage.py migrate   
18.2.6 向管理网站注册Entry
from django.contrib import admin
from .models import Topic,Entry

# Register your models here.
from .models import Topic

admin.site.register(Topic)
admin.site.register(Entry)
18.2.7 Django shell
python manage.py shell
18.3 创建页面:学习笔记主页


18.3.1 映射URL
"""定义learning_logs的URL模式"""
from django.urls import path
from . import views

app_name = 'learnings_logs'
urlpatterns= [
    # 主页
    path('',views.index,name='index') ]
18.3.2 编写视图
from django.shortcuts import render

# Create your views here.
def index(request):
    """学习笔记的主页"""
    return render(request,'learning_log/index.html')
18.3.3 编写模板
这一步跟着书里做还是不行,一直显示找不到模板。
要多做两件事:
1、在settings的TEMPLATES 修改DIRS:
        'DIRS': [os.path.join(BASE_DIR, 'templates')]
2、把templates文件夹拿到与APP同级的位置(也就是不能像书里那样放到很里面)。
详细内容可参考以下网址:
https://blog.csdn.net/asdfjkl1234156/article/details/107927407?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522161484963916780264058181%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=161484963916780264058181&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-4-107927407.first_rank_v2_pc_rank_v29&utm_term=django.template.exceptions.TemplateDoesNotExist%3A+
18.4 创建其他页面
18.4.1 父模板
<p>
    <a href="{% url 'learning_logs:index' %}">Learning Log</a>
</p>

{% block content %}{% endblock content %}





<!DOCTYPE html>
{% extends "learning_logs/base.html" %}
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>学习笔记</title>

</head>
<body>
    {% block content %}
    <p>但是我就是不学习,哈哈哈</p>
    {% endblock content %}
</body>
</html>
18.4.2 显示所有主题的页面
1.URL模式
"""定义learning_logs的URL模式"""
from django.urls import path
from . import views

app_name = 'learning_logs'
urlpatterns= [
    # 主页
    path('',views.index,name='index'),

    # 显示所有主题
    path('topics/' ,views.topics,name='topics'),
    ]

2.视图
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)

3.模板
{% extends "learning_logs/base.html" %}

{% block content %}
<p>Topics</p>

<ul>
    {% for topic in topics %}
    <li>{{topic}}</li>
    {% empty %}
    <li>No topics have benn added yet.</li>
    {% endfor %}
</ul>

{% endblock content %}
18.4.3 显示特定主题的页面
"""定义learning_logs的URL模式"""
from django.urls import path
from . import views

app_name = 'learning_logs'
urlpatterns= [
    # 主页
    path('',views.index,name='index'),

    # 显示所有主题
    path('topics/' ,views.topics,name='topics'),
    
    # 特定主题的详细页面
    path('topics/<int:topic_id>/',views.topic,name='topic')
    ]

2.视图
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):
    """显示所有的主题"""
    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/topics.html',context)

3.模板
{% extends "learning_logs/base.html" %}

{% block content %}
<p>Topics:{{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 %}

到这里为止,18章结束。主页能打开,页面就报错,我百度了一下,很多人表示书中的版本比较老,所以跟现在的有差异。

同时,我也觉得这章的难度实在是太大了,不仅涉及到了Python,甚至还有HTML。

如果是真的想用Django写前端,建议还是找本踏实点的书开始学吧。本书不太适合。

总得来说,难且没必要。本想通过B站up主致敬大神来通关,结果发现她那版视频里没有第三部分的项目,不知道是不是第一版的书中没有。

于是我决定,本书的读书笔记(不如说是抄书笔记)到此截止了。顺带一提,因为小甲鱼更新的实在是太慢了,平均一个月更新一集。我也决定另投他人门下。

嗯,那就这样,我们下个系列再见吧。

胭惜雨

2021年03月04日

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据