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

定义模型

  1. 用外键连接Topic
  2. 条目内容(不限制长度)
  3. 自动添加时间戳
# ...
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. 网页效果

主页

主题列表

主题页

posted @ 2021-09-06 23:42  ikventure  阅读(93)  评论(0)    收藏  举报