《Python编程:从入门到实践》中Learning Log项目的学习记录
准备工作
新建项目文件夹learning_log
在CMD窗口中切换到目录learning_log
创建虚拟环境:python -m venv ll_env
激活虚拟环境:ll_env\scripts\activate
确认下Python版本:python --version
我用的是Python 3.10.8
安装Django:pip install Django
在Django中创建项目:django-admin startproject learning_log .
创建数据库:python manage.py migrate
启动服务器:python manage.py runserver
再打开一个新的CMD窗口,切换到manage.py文件所在目录,激活虚拟环境
创建应用程序:python manage.py startapp learning_logs
开始
定义模型
learning_log\learning_logs\models.py
from django.db import models
# Create your models here.
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_log\learning_log\settings.py
# Application definition
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
Django管理网站
创建超级用户:python manage.py createsuperuser
Username:ll_admin
Password:ll_admin
向管理网站注册模型
learning_log\learning_logs\admin.py
from django.contrib import admin
# Register your models here.
from learning_logs.models import Topic
admin.site.register(Topic)
在127.0.0.1:8000/admin网站管理页面,添加主题Chess、Rock Climbing
定义模型Entry
learning_log\learning_logs\models.py
from django.db import models
# Create your models here.
class Topic(models.Model):
"""用户学习的主题"""
text = models.CharField(max_length=200)
date_added = models.DateTimeField(auto_now_add=True)
def __str__(self):
"""返回模型的字符串表示"""
return self.text
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] + "..."
再次迁移数据库
python manage.py makemigrations learning_logs
python manage.py migrate
向管理网站注册Entry
learning_log\learning_logs\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)
创建网页:学习笔记主页
1、映射URL
learning_log\learning_log\urls.py
from django.contrib import admin
from django.urls import path
from django.conf.urls import include
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('learning_logs.urls',namespace='learning_logs')),
]
在文件夹learning_logs中创建另一个urls.py
learning_log\learning_logs\urls.py
"""定义learning_logs的URL模式"""
from django.urls import path
from . import views
app_name = 'learning_logs'
urlpatterns = [
# 主页
path('', views.index, name='index')
]
2、编写视图
learning_log\learning_logs\views.py
from django.shortcuts import render
# Create your views here.
def index(request):
"""学习笔记的主页"""
return render(request, 'learning_logs/index.html')
3、编写模板
在文件夹learning_logs中新建templates文件夹,在template文件夹中再新建learning_logs文件夹,在其中新建index.html
learning_log\learning_logs\templates\learning_logs\index.html
<p>Learning Log</p>
<p>Learning Log helps you keep track of your learning, for any topic you're learning about.</p>
创建其他网页
创建父模板
learning_log\learning_logs\templates\learning_logs\base.html
<p>
<a href="{% url 'learning_logs:index' %}">Learning Log</a>
</p>
{% block content %}{% endblock content %}
子模板
重新编写index.html,使其继承base.html
learning_log\learning_logs\templates\learning_logs\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 %}
显示所有主题的页面
1、URL模式
learning_log\learning_logs\urls.py
"""定义learning_logs的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'),
]
2、视图
learning_log\learning_logs\views.py
from django.shortcuts import render
from .models import Topic
# Create your views here.
def index(request):
"""学习笔记的主页"""
return render(request, 'learning_logs/index.html')
def topics(request):
"""显示所有的主题"""
topics = Topic.objects.order_by('date_added')
context = {'topics':topics}
return render(request, 'learning_logs/topics.html', context)
3、模板
learning_log\learning_logs\templates\learning_logs\topics.html
{% extends "learning_logs/base.html" %}
{% block content %}
<p>Topics</p>
<ul>
{% for topic in topics %}
<li>{{topic}}</li>
{% empty %}
<li>No topics have been added yet.</li>
{% endfor %}
</ul>
{% endblock content %}
修改父模板,包含显示所有主题的页面链接
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 %}
显示特定主题的页面
1、URL模式
"""定义learning_logs的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'),
]
2、视图views.py
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)
3、模板
{% extends 'learning_logs/base.html' %}
{% block content %}
<p>Topic:{{topic}}</p>
<p>Entries:</p>
<p>
<a href="{% url 'learning_logs:new_entry' topic.id %}">add new entry</a>
</p>
<ul>
{% for entry in entries %}
<li>
<p>{{entry.date_added|date:'M d, Y H:i'}}</p>
<p>{{entry.text|linebreaks}}</p>
<p>
<a href="{% url 'learning_logs:edit_entry' entry.id %}">edit entry</a>
</p>
</li>
{% empty %}
<li>
There are no entries for this topic yet.
</li>
{% endfor %}
</ul>
{% endblock content %}