django入门 - 学习笔记应用
教程来自 Python Crash Course.
创建学习笔记应用:用户可以记录学习主题Topic并向主题中添加日志条目Entry。
目录
1. 创建应用程序
在原mysite项目中添加应用(创建项目和超级用户等过程参考Django初学教程系列),在虚拟环境中执行命令行:
python manage.py startapp learning_logs
2. 创建主题Topic模型
定义模型
# learning_logs/models.py
from django.db import models
class Topic(models.Model):
text = models.CharField(max_length=200)
date_added = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.text
激活模型
先将learning_logs添加到INSTALLED_APPS
# mysite/settings.py
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'polls.apps.PollsConfig',
'learning_logs',
]
修改数据库,先创建迁移文件,再查看迁移对应的SQL命令(可选),最后进行迁移:
python manage.py makemigrations learning_logs
python manage.py sqlmigrate learning_logs 0001
python manage.py migrate
注册模型
from django.contrib import admin
from .models import Topic
admin.site.register(Topic)
显示效果:

add 添加两个主题:数据结构与算法、机器学习
3. 创建条目Entry模型
定义模型
- 用外键连接Topic
- 条目内容(不限制长度)
- 自动添加时间戳
# ...
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] + "..."
关于Meta类选项:
verbose_name_plural表示对象的复数名称,默认使用单数名称+s,考虑到entry复数为entries,所以需要单独设置verbose_name_plural。

设置后效果:

迁移模型
依然是命令行迁移:

注册模型
from django.contrib import admin
from .models import Topic, Entry
admin.site.register(Topic)
admin.site.register(Entry)
通过ADD ENTRY可选择主题类型并添加条目内容。
Django shell
通过命令行进入交互式shell对话,检查上方改动的影响:
python manage.py shell

4. 创建学习笔记主页
映射URL
# mysite/urls.py
from django.contrib import admin
from django.urls import include, path
urlpatterns = [
path('admin/', admin.site.urls),
path('polls/', include('polls.urls')),
path('learning_logs/', include('learning_logs.urls')),
]
# learning_logs/urls.py
from django.urls import path
from . import views
app_name = 'learning_logs'
urlpatterns = [
path('', views.index, name='index')
]
编写视图
# mysite/views.py
from django.shortcuts import render
def index(request):
return render(request, 'learning_logs/index.html')
编写模板
render参数index.html
<h1>
学习笔记
</h1>
<p>学习笔记帮你记录任意主题的学习过程</p>
5. 创建其他网页
模板继承
父模板
base.html
<p>
<a href="{% url 'learning_logs:index' %}">学习笔记</a>
</p>
{% block content %}{% endblock content %}
content块是一个占位符,其中包含的信息由子模板指定。
子模版
index.html
{% extends "learning_logs/base.html" %}
{% block content %}
<p>学习笔记帮你记录任意主题的学习过程</p>
{% endblock content %}
{% extends %}表示继承自哪个父模板
显示所有主题
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'),
]
视图
from django.shortcuts import render
from .models import Topic
def index(request):
return render(request, 'learning_logs/index.html')
def topics(request):
topic = Topic.objects.order_by('date_added')
context = {'topics': topic}
return render(request, 'learning_logs/topics.html', context)
模板
topics.html
{% extends "learning_logs/base.html" %}
{% block content %}
<p>主题</p>
<ul>
{% for topic in topics %}
<li>{{ topic }}</li>
{% empty %}
<li>当前还没有添加过主题。</li>
{% endfor %}
</ul>
{% endblock content %}
<ul></ul>表示无序列表,for循环将每个主题转换为一个项目列表项,{{ }}表示变量,循环格式:
{% for item in list %}
do something with each item
{% endfor %}
在父模板中加上主题页面的链接:
<p>
<a href="{% url 'learning_logs:index' %}">学习笔记</a> -
<a href="{% url 'learning_logs:topics' %}">主题</a>
</p>
{% block content %}{% endblock content %}
显示特定主题
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'),
]
视图
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)
模板
{% extends "learning_logs/base.html" %}
{% block content %}
<p>主题: {{ topic }}</p>
<p>条目: </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>当前主题还没有添加过条目。</li>
{% endfor %}
</ul>
{% endblock content %}
6. 网页效果
主页

主题列表

主题页


浙公网安备 33010602011771号