Django 我单独起个标题,因为页数有点多,且第一次接触后端的知识。
Django 是一个 web 框架 —— 一套用于帮助开发交互式网站的工具。
18.1 建立项目
我是在 window10 下创建这个项目的。
18.1.2 建立虚拟环境
为项目新建一个目录,将其命名为 learning_log,再在终端切换到这个目录。
python -m venv 11_env
18.1.3 安装 virtualenv
pip install --user virtualenv
18.1.4 激活环境
11_env\Scripts\activate
18.1.5 安装 Django
pip install Django
18.1.6 在 Django 中创建项目
Django-admin.py startproject learning_log .
一定要注意后面那个点不要忘了。
18.1.7 创建数据库
python manage.py migrate
可能会出现错误,尝试升级 pip 与 Django 版本应该能解决。
18.1.8 查看项目
python manage.py runserver
启动服务器,之后打开浏览器输入 127.0.0.1:8000,可查看是否搭起环境,如果要关闭这个服务器,可以按CRTL + C。
18.2 创建应用程序
当前,在前面打开的终端运行着 runserver,所以请再打开一个终端。
python manage.py startapp learning_logs
18.2.1 定义模型
修改 models.py
class Topic(models.Model):
text = models.CharField(max_length=200)
date_added = models.DateTimeField(auto_now_add=True)
def __str__(self):
'''返回模型的字符串表示'''
return self.text
18.2.2 激活模型
修改 setting.py
#注册
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
#我的程序
'learning_logs',
]
迁移数据库
python manage.py makemigrations learning_logs
应用迁移
python manage.py migrate
每当需要修改时,基本为三步:1.修改 models.py ; 2.对 learning_logs 调用 makemigrations;3.让 Django 迁移。
18.2.3 Django 管理网站
1.创建超级用户
python manage.py createsuperuser
会提示数据名字和email和密码。
建立好之后,再次打开数据库,你会发现在auth_user中多了条记录,名字是你自己起的,密码是散列。
2.注册模型
修改 admin.py
from django.contrib import admin
# Register your models here.
from learning_logs.models import Topic
admin.site.register(Topic)
3.添加主题
18.2.4 定义模型 Entry
修改 models.py
-- snip --
class Entry(models.Model):
'''学到的有关某个主题的具体知识'''
# Entry 建立了三个字段,topic,text和 date_added。
#解决TypeError: __init__() missing 1 required positional argument: 'on_delete'
#少位置参数on_delete,重新指定外键方式
topic = models.ForeignKey(Topic,on_delete=models.CASCADE)
text = models.TextField()
date_added = models.DateTimeField(auto_now_add=True)
#Meta 存储用于管理模型的额外信息
class Meta:
verbose_name_plural = 'entries'
def __str__(self):
'''返回模型的字符串表示'''
return self.text[:50] + '...'
18.2.5 迁移模型
python manage.py makemigrations learning_logs
python manage.py migrate
18.2.6 注册 Entry
修改 admin.py
from django.contrib import admin
# Register your models here.
from learning_logs.models import Topic, Entry
admin.site.register(Topic)
admin.site.register(Entry)
18,2,7 Django shell
输入了一些数据之后,就能通过交互式的编程方式查看这些数据了。这种交互式环境称为 Django shell。
python manage.py shell
>>> from learning_logs.models import Topic
>>> Topic.objects.all()
[<Topic: Chess>, <Topic: Rock Climbing>]
18.3 创建网页:学习笔记主页
使用Django创建网页的几个步骤:
定义URL
编写视图函数
编写模板
18.3.1 映射 URL
打开learning_log下面的文件urls
from django.conf.urls import url, include
from django.contrib import admin
# 该模块定义了可在管理网站中请求的所有 URL
urlpatterns = [
#去掉第一个url后的include(),不然报错
url(r'^admin/',admin.site.urls),
# 实参 namespace,让我们能够将 learning_logs 的 URL 同项目中的其他 URL 区分开来。
url(r'', include('learning_logs.urls', namespace='learning_logs')),
]
打开 learning_logs,创建另一个 url
from django.conf.urls import url
from . import views
'''定义 learning_logs 的 URL 模式'''
# 该模块定义了可在管理网站中请求的所有 URL
urlpatterns = [
# url() 的第一个参数是正则表达式,第二个是要调用的视图函数,第三个是这个 URL 模式的名称
# r:让 python 将接下来的字符串视为原始字符串
# ^:查看字符串开头
# $:查看字符串末尾
# (r'^$'):即表示头尾没有任何东西的 URL(python 默认忽略项目的基础 URL(http://localhost:8080/)),
# 所以这个正则表达式匹配基础 URL。
# 主页
url(r'^$', views.index, name='index'),
# 显示所有主题
url(r'^topics/$', views.topics, name='topics'),
# 特定主题的详细页面
url(r'^topics/(?P<topic_id>\d+)/$', views.topic, name='topic'),
]
#与书本上版本不一样,注意添加这个(书上没有)
app_name = "learning_logs"
18.3.2 编写视图
view.py
from django.shortcuts import render
from .models import Topic
# Create your views here.
def index(request):
'''学习笔记的主页'''
return render(request, 'learning_logs/index.html')
# URL 请求与我们刚才定义的模式匹配时,Django 将在文件 views.py 中查找函数 index(),再将
# 请求对象传递给这个视图函数。
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 = {'topics': topics, 'entries': entries}
return render(request, 'learning_logs/topic.html', context)
18.3.2 编写模板
base.html
<p>
<a href="{% url 'learning_logs:index' %}">Learning Log</a> -
<a href="{% url 'learning_logs:topics' %}">Topics</a>
</p>
{% block content %}{% endblock %}
index.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 %}
topic.html
{% 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 %}
</ul>
{% endblock content %}
topics.html
{% 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 %}
模板继承:
创建网页时,几乎都有一些索引网页包含的元素,在这种情况下可以编写一个包含通用的元素的父模板。
模板标签:
{% %}:生成页面显示的信息
总之,今天的内容主要有 2 个套路。
套路1:
- 定义模型
- 生成迁移文件
- 迁移数据库
套路2:
- 定义URL
- 编写视图函数
- 编写模板
今天就这样了,清明期间有点累,基本没看书,从今天开始调整状态。