1.建立项目
1.1制定规范
项目的目标,项目的功能,项目的外观和用户界面。
1.2建立虚拟环境
python -m venv ll_env
1.3激活虚拟环境
ll_env\Scripts\activate
1.4在 Django 中创建项目
django-admin startproject learning_log .
1.5创建数据库
python manage.py migrate
1.6查看项目
python manage.py runserver
2.创建应用程序
Django项目由一系列应用程序组成,它们协同工作,让项目成为一个整体。
python manage.py startapp appname
2.1定义模型
模型告诉Django如何处理应用程序中存储的数据。model.py
from django.db import models
class Topic(models.Model):
"""A topic the user is learning about."""
text = models.CharField(max_length=200)
date_added = models.DateTimeField(auto_now_add=True)
def __str__(self):
"""Return a string representation of the model."""
return self.text
2.2激活模型
--snip--
INSTALLED_APPS = (
--snip--
'django.contrib.staticfiles',
'learning_logs',# 我的应用程序
)
需要让Django修改数据库,使其能够存储与模型Topic相关的信息。
python manage.py makemigrations learning_logs
命令makemigrations让Django确定该如何修改数据库,使其能够存储与我们定义的新模型相关联的数据。输出表明Django创建了一个名为0001_initial.py的迁移文件,这个文件将在数据库中为模型Topic创建一个表。
下面来应用这种迁移,让Django替我们修改数据库:
python manage.py migrate
每当需要修改“学习笔记”管理的数据时,都采取如下三个步骤:修改models.py;对learning_logs调用makemigrations;让Django迁移项目。
2.3 Django 管理网站
为应用程序定义模型时, Django提供的管理网站(admin site)让你能够轻松地处理模型。网站的管理员可使用管理网站,但普通用户不能使用。
创建超级用户
Django允许你创建具备所有权限的用户——超级用户。
python manage.py createsuperuser
向管理网站注册模型
Django自动在管理网站中添加了一些模型,如User和Group,但对于我们创建的模型,必须手工进行注册。
admin.py
from django.contrib import admin
from learning_logs.models import Topic
admin.site.register(Topic)
添加主题
单击add,为模型Topic添加主题。
2.4 定义模型+1
要记录学到的国际象棋和攀岩知识,需要为用户可在学习笔记中添加的条目定义模型。每个条目都与特定主题相关联,这种关系被称为多对一关系,即多个条目可关联到同一个主题。
class Entry(models.Model):
"""学到的有关某个主题的具体知识"""
topic = models.ForeignKey(Topic,on_delete=models.CASCADE)
text = models.TextField()
date_added = models.DateTimeField(auto_now_add=True)
属性topic是一个ForeignKey实例。外键是一个数据库术语,它引用了数据库中的另一条记录;这些代码将每个条目关联到特定的主题。
定义模型,(激活)迁移模型,注册模型
2.5 Django shell
输入一些数据后,就可通过交互式终端会话以编程方式查看这些数据了。这种交互式环境称为Django shell,是测试项目和排除其故障的理想之地。
python manage.py shell
>>> from learning_logs.models import Topic
>>> Topic.objects.all()
3.创建网页
使用Django创建网页的过程通常分三个阶段:定义URL、编写视图和编写模板。
3.1映射 URL
用户通过在浏览器中输入URL以及单击链接来请求网页,因此我们需要确定项目需要哪些URL 。 主 页 的 URL 最 重 要 , 它 是 用 户 用 来 访 问 项 目 的 基 础 URL 。 当 前 , 基 础 URL(http://localhost:8000/) 返回默认的Django网站,让我们知道正确地建立了项目。我们将修改这一点,将这个基础URL映射到“学习笔记”的主页。
urls.py
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('learning_logs.urls')),//扩展
]
在文件夹learning_logs中创建另一个urls.py文件:
urls.py
from django.urls import path
from . import views
app_name = 'learning_logs'
urlpatterns = [
# Home page
path('', views.index, name='index'),
]
变量urlpatterns是一个列表,包含可在应用程序learning_logs中请求的网页。
url()的第二个实参指定了要调用的视图函数。请求的URL与第一个参数匹配时,Django将调用views.index。第三个实参将这个URL模式的名称指定为index,让我们能够在代码的其他地方引用它。每当需要提供到这个主页的链接时,我们都将使用这个名称,而不编写URL。
3.2 编写视图
视图函数接受请求中的信息,准备好生成网页所需的数据,再将这些数据发送给浏览器——这通常是使用定义了网页是什么样的模板实现的。
views.py
from django.shortcuts import render
def index(request):
"""学习笔记的主页"""
return render(request, 'learning_logs/index.html')
函数render(),它根据视图提供的数据渲染响应。
URL请求与我们刚才定义的模式匹配时, Django将在文件views.py中查找函index(),再将请求对象传递给这个视图函数。在这里,我们不需要处理任何数据,因此这个函数只包含调用render()的代码。这里向函数render()提供了两个实参:原始请求对象以及一个可用于创建网页的模板。
3.3 编写模板
模板定义了网页的结构。模板指定了网页是什么样的,而每当网页被请求时,Django将填入相关的数据。模板让你能够访问视图提供的任何数据。
index.html
4. 创建其他网页
4.1 模板继承
父模板
我们首先来创建一个名为base.html的模板,并将其存储在index.html所在的目录中。这个文件包含所有页面都有的元素;其他的模板都继承base.html。当前,所有页面都包含的元素只有顶端的标题。我们将在每个页面中包含这个模板,因此我们将这个标题设置为到主页的链接:
base.html
<p>
<a href="{% url 'learning_logs:index' %}">Learning Log</a> -
<a href="{% url 'learning_logs:topics' %}">Topics</a>
</p>
{% block content %}{% endblock content %}
子模板
重新编写index.html,使其继承base.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 content %}
4.2 显示所有主题的页面
topics.html
4.3 显示特定主题的页面
显示特定主题的页面的URL模式与前面的所有URL模式都稍有不同,因为它将使用主题的id属性来指出请求的是哪个主题。
path('topics/<int:topic_id>/', views.topic, name='topic')
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)