环境:Python3.11
Django5.0.1
一、建立项目
创建虚拟环境
为项目新建一个目录,将其命名为 learning_log ,再在终端中切换到这个目录,并创建一个虚拟环境。
python -m venv ll_env
项目列表生成了这样的一个文件夹
然后激活虚拟环境
ll_env\Scripts\activate
控制台前方出现高亮即为成功
创建并激活虚拟环境后,就可安装Django了:
pip install Django
新建项目
在依然处于活动的虚拟环境的情况下( ll_env 包含在括号内),执行如下命令来新建一个项目:
django-admin.py startproject learning_log
此时,出现一个名叫learning_log的文件夹。
创建数据库
python manage.py migrate
此时Django 又创建了一个文件 ——db.sqlite3
下面来核实 Django 是否正确地创建了项目。为此,可执行命令 runserver
python manage.py runserver
点击链接,出现这个页面即为成功。
二、创建应用程序
当前,在前面打开的终端窗口中应该还运行着 runserver 。请再打开一个终端窗口(或标签页),并切换到 manage.py 所在的目录。激活该虚拟环境,再执行命令 startapp :
python manage.py startapp learning_logs
将看到其中新增了一个文件夹 learning_logs
定义模型
打开learning_logs/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 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 self.text[:50] + "..."
激活模型
打开settings.py
请将 INSTALLED_APPS 修改成下面这样
# 我的应用程序 'learning_logs',
接下来,需要让 Django 修改数据库,使其能够存储与模型 Topic 相关的信息。为此,在终端窗口中执行下面的命令:
python manage.py makemigrations learning_logs
输出表明 Django 创建了一个名为 0001_initial.py 的迁移文件,这个文件 将在数据库中为模型Topic 创建一个表。
下面来应用这种迁移,让 Django 替我们修改数据库:
python manage.py migrate
每当需要修改 “ 学习笔记 ” 管理的数据时,都采取如下三个步骤:
修改models.py;
对learning_logs 调用makemigrations ;
让Django迁移项目。
创建超级用户
在控制台输入:
python manage.py createsuperuser
根据提示输入信息
注册模型
我们创建应用程序 learning_logs 时, Django 在 models.py 所在的目录中创建了一个名为 admin.py 的文件:
from django.contrib import admin # Register your models here. from learning_logs.models import Topic admin.site.register(Topic) from learning_logs.models import Entry admin.site.register(Entry)
现在,使用超级用户账户访问管理网站:访问 http://localhost:8000/admin/ ,并输入你刚创建的超级用户的用户名和密码
添加主题
书中提供的信息如下:
The opening is thefirst part ofthe game, roughly thefirst tenmoves or so. In the opening, it'sa good ideato do threethings— bring out your bishopsand knights, try to controlthecenter ofthe
board,and castle your king. (国际象棋的第一个阶段是开局,大致是前 10 步左右。在开局阶段,最好做三件事情:将象和马调出来;努力控制棋盘的中间区域;用车将王
护住。)
Ofcourse, thesearejust guidelines. It will beimportant to learnwhen to followthese guidelinesand when to disregard thesesuggestions. (当然,这些只是指导原则。学习什么情况下遵
守这些原则、什么情况下不用遵守很重要。)
再来创建一个国际象棋条目,并创建一个攀岩条目,以提供一些初始数据。下面是第二个国际象棋条目。
In the opening phase ofthe game, it's important to bring out your bishopsand knights. These piecesare powerfuland maneuverableenough to play asignificant rolein the beginningmoves ofa
game. (在国际象棋的开局阶段,将象和马调出来很重要。这些棋子威力大,机动性强,在开局阶段扮演着重要角色。)
下面是第一个攀岩条目:
One ofthe most importantconcepts in climbing is to keep your weight on your feetas much as possible. There'sa myth thatclimberscan hang all day on theirarms. In reality, good climbers have
practiced specific ways of keeping their weight over their feet whenever possible. (最重要的攀岩概念之一是尽可能让双脚承受体重。有谬误认为攀岩者能依靠手臂的力量坚持一
整天。实际上,优秀的攀岩者都经过专门训练,能够尽可能让双脚承受体重。)
三、创建网页
映射url
打开项目主文件夹 learning_log 中的文件urls.py,我们需要包含 learning_logs 的 URL
from django.contrib import admin from django.urls import path, include urlpatterns = [ path('admin/', admin.site.urls), path('', include('learning_logs.urls', namespace='learning_logs')), # url(r'', include('learning_logs.urls', namespace='learning_logs')), # Django2.0使用djang.urls.path ]
现在我们需要在文件夹 learning_logs 中创建另一个 urls.py 文件:
"""定义learning_logs的URL模式""" from django.urls import path #从当前的urls.py模块所在的文件夹中导入视图 from . import views #变量urlpatterns是一个列表,包含可在应用程序learning_logs中请求的网页 app_name = 'learning_logs' urlpatterns = [ #主页 #第一个是正则表达式,r让Python将接下来的字符串视为原始字符串,引号正则表达式始于和终于何处 #第二个实参指定了要调用的视图函数 #第三个实参将这个URL模式的名称指定为index path(r'',views.index,name='index'), # 显示所有的主题 path(r'topics/', views.topics, name='topics'), # 特定主题的详细页面 path(r'^topics/(?P<topic_id>\d+)/$', views.topic, name='topic'), ]
编写视图
learning_logs 中的文件 views.py 是你执行命令 python manage.py startapp 时自动生成的
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) 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)
编写模板
按顺序新建文件夹以及四个页面
base.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <p> <a href="{% url 'learning_logs:index' %}">Learning Log</a>- <a href="{% url 'learning_logs:topics' %}">Topics</a> </p> {% block content %}{% endblock content %} </body> </html>
index.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> {% 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 content %} </body> </html>
topic.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> {% 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 %} {% endblock content %} </ul> </body> </html>
topics.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Topics</title> </head> <body> {% 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 %} </body> </html>
四、效果
点击Topics
点击Chess