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号
浙公网安备 33010602011771号