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激活模型

setting.py

--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)
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐