今天开始就是本书的最后一个项目: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日