《Python编程:从入门到实践》第十八章笔记:Django最基本用法笔记
最近在看Python编程:从入门到实践,这是这本书“项目3 Web应用程序”第18章的笔记。记录了django最基本的一些日常用法,以便自己查阅。
可能是我的这本书版本比较老,书上项目的代码直接跑跑不通,也有一些小小的错误。这里我做了一些修改。
基本用法
- 创建项目
django-admin startproject 项目名 .
- 创建数据库
python manage.py migrate
- 查看项目
python manage.py runserver
- 创建应用程序
python manage.py startapp 应用程序名
激活模型:
- 在settings.py的INSTALLED_APPS中加入刚才创建的应用程序
- 修改数据库,使其能够存储与模型相关的信息:
python manage.py makemigrations 应用程序名
上述操作产生一个迁移文件(“0001_initial.py”),让Django应用这种迁移修改数据库:
python manage.py migrate
只要添加了新的模型,就需要重复上面两个命令再次迁移数据库。
- 创建超级用户:
python manage.py createsuperuser
- 向管理网站注册模型:
在admin.py中from xxx.models import 模型名
admin.site.register(模型名)
然后就能使用超级用户账户访问管理网站了:http://localhost:8000/admin/
利用shell查看输入的数据
使用书上的例子:
进入shell python manage.py shell
from learning_logs.models import Topic
获取模型Topic的所有实例
Topic.objects.all()
打印每个对象的ID
topics = Topic.objects.all()
for topic in topics: print(topic.id, topic)
于是就能通过ID来查看对象的属性了
t = Topic.objects.get(id=1)
属性: t.text
t.date_added
另一个模型Entry有个属性是topic是它的ForeignKey,可以通过这种关联获取数据
t.entry_set.all()
其中entry是相关模型的小写名称,可以返回出与t相关的Entry的所有对象条目
创建一个主页
分为三个阶段:定义URL、编写视图和编写模板
每个URL对应特定的视图,视图调用一个模板,浏览器通过模板生成网页.
定义URL
在urls.py中的urlpatterns中添加相应的url。
书上的代码是:
在learning_log/urls.py中加入:
url(r'', include('learning_logs.urls', namespace='learning_logs'))
目的是让learning_logs的URL同项目中的其他URL区分开。
然后在learning_logs中创建另一个urls.py文件,引入views
from . import views
其中的urlpatterns中加入
url(r'^$', views.index, name='index')
我的django版本与书上不同,没有url(),只有path()。
我的代码是:
在learning_log/urls.py中
path('', include('learning_logs.urls')),
在learning_logs/urls.py中
path('', views.index, name='index'),
------------------
并且要在此文件中声明:
app_name = 'learning_logs'
(这里我没有仔细看,只是好像不加会报错)
编写视图
views.py中,render()作用是根据提供的数据渲染响应。
书上为主页编写了视图
def index(request):
return render(request, 'learning_logs/index.html')
编写模板
在learning_logs中新建一个文件夹,并将其命名为templates。在文件夹templates中,再新建一个文件夹,命名为learning_logs。这是Django能明确解读的结构。
在最里面的文件夹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>
创建其他网页
这个部分书上的代码都跑不通,就把自己修改后的代码写上来。
父模板
先创建一个父模板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 %}
子模板
重新编写index.html
使其继承base.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 %}
其中,不是从父模板继承的内容都包含在content块中
显示所有主题(Topics)的页面
定义所有主题页面的URL
修改learning_logs/urls.py,urlpatterns中加上:
path('topics/', views.topics, name='topics'),
视图
修改views.py,加上这段代码
def topics(request):
_topics = Topic.objects.order_by('date_added')
context = {'topics': _topics}
return render(request, './learning_logs/topics.html', context)
context是要发给模板的上下文,是一个字典,键是在模板中要访问数据的名称,值是要发送给模板的数据。
模板
创建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 %}
修改父模板,使其包含到所有这些页面的链接,改成这样
<p>
<a href="{% url 'learning_logs:index' %}">Learning Log</a> -
<a href="{% url 'learning_logs:topics' %}">Topics</a>
</p>
{% block content %}{% endblock content %}
显示特定主题(Topic)的页面
与上面的做法都类似:URL/视图/模板。
URL
在learning_logs/urls.py中,加入
path('topics/<int:topic_id>', views.topic, name='topic')
视图
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)
date_added前面的减号指定按降序排列。即先显示最近的条目,把主题和条目存进context中,再发送给topic.html
模板
新建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>No entry for this topic yet.</li>
{% endfor %}
</ul>
{% endblock content %}
“|”表示模板过滤器,即这个后面是对模板变量修改的函数。
这里date中,M是month,d是day.........于是显示出来的就是这样:Jul 25, 2022 08:15
linebreaks将包含换行符的长条目转换为浏览器能够理解的格式,以免显示为一个不间断的文本块。
将这些topic的页面设置为链接
修改topics.html
,让每个topic都链接到对应网页。改成酱紫:
{% 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>
{% endfor %}
</ul>
{% endblock content %}
贴几张到此为止的网页截图:
《Python编程:从入门到实践》第十八章笔记:Django最基本用法笔记的更多相关文章
- Python编程从入门到实践笔记——异常和存储数据
Python编程从入门到实践笔记——异常和存储数据 #coding=gbk #Python编程从入门到实践笔记——异常和存储数据 #10.3异常 #Python使用被称为异常的特殊对象来管理程序执行期 ...
- Python编程从入门到实践笔记——文件
Python编程从入门到实践笔记——文件 #coding=gbk #Python编程从入门到实践笔记——文件 #10.1从文件中读取数据 #1.读取整个文件 file_name = 'pi_digit ...
- Python编程从入门到实践笔记——类
Python编程从入门到实践笔记——类 #coding=gbk #Python编程从入门到实践笔记——类 #9.1创建和使用类 #1.创建Dog类 class Dog():#类名首字母大写 " ...
- Python编程从入门到实践笔记——函数
Python编程从入门到实践笔记——函数 #coding=gbk #Python编程从入门到实践笔记——函数 #8.1定义函数 def 函数名(形参): # [缩进]注释+函数体 #1.向函数传递信息 ...
- Python编程从入门到实践笔记——用户输入和while循环
Python编程从入门到实践笔记——用户输入和while循环 #coding=utf-8 #函数input()让程序暂停运行,等待用户输入一些文本.得到用户的输入以后将其存储在一个变量中,方便后续使用 ...
- Python编程从入门到实践笔记——字典
Python编程从入门到实践笔记——字典 #coding=utf-8 #字典--放在{}中的键值对:跟json很像 #键和值之间用:分隔:键值对之间用,分隔 alien_0 = {'color':'g ...
- Python编程从入门到实践笔记——if语句
Python编程从入门到实践笔记——if语句 #coding=utf-8 cars=['bwm','audi','toyota','subaru','maserati'] bicycles = [&q ...
- Python编程从入门到实践笔记——操作列表
Python编程从入门到实践笔记——操作列表 #coding=utf-8 magicians = ['alice','david','carolina'] #遍历整个列表 for magician i ...
- Python编程从入门到实践笔记——列表简介
Python编程从入门到实践笔记——列表简介 #coding=utf-8 #列表——我的理解等于C语言和Java中的数组 bicycles = ["trek","cann ...
- Python编程从入门到实践笔记——变量和简单数据类型
Python编程从入门到实践笔记——变量和简单数据类型 #coding=gbk #变量 message_1 = 'aAa fff' message_2 = 'hart' message_3 = &qu ...
随机推荐
- NMS技术总结(NMS原理、多类别NMS、NMS的缺陷、NMS的改进思路、各种NMS方法)
前言 本文介绍了NMS的应用场合.基本原理.多类别NMS方法和实践代码.NMS的缺陷和改进思路.介绍了改进NMS的几种常用方法.提供了其它不常用的方法的链接. 本文很早以前发过,有个读者评论说 ...
- Java遇上SPL:架构优势和开发效率,一个不放过
摘要:如果我们在Java中也提供有一套完整的结构化数据处理和计算类库,那这个问题就能得到解决:即享受到架构的优势,又不致于降低开发效率. 本文分享自华为云社区<Java结构化处理SPL>, ...
- 使用BGP-blackhole解决IDC频繁遭受DDOS攻击困扰
项目背景 该项目位于某市级BGP IDC机房,机房客户多为web业务,遭受小流量攻击(10G量级)较为频繁,针对这一现象在机房core旁路部署ADS系统,牵引异常流量清洗后进行回源,该清洗方案在此不再 ...
- TinyMCE简介
TinyMCE是一款开源.易用.UI时新的富文本编辑器. 插件丰富,自带插件基本满足要求 可扩展性强,可自定义功能 界面好看,符合现代审美 提供经典.内联.沉浸无干扰三种模式 官网:https://w ...
- MUI+html5+script 不同页面间转跳(九宫格)
在点击图片/标题需要跳转到详情页面的使用场景中,首先定义图片元素的id为"tyzc",是同一类下的第一个图片 <img src="img/img3.png" ...
- Wget命令解释
Wget主要用于下载文件,在安装软件时会经常用到,以下对wget做简单说明. 1.下载单个文件:wget http://www.baidu.com.命令会直接在当前目录下载一个index.html的文 ...
- RocketMQ的基本使用
第一步导入依赖: <!--Springboot 集成 RocketMQ依赖--> <dependency> <groupId>org.apache.rocketmq ...
- 10分钟快速部署camunda BPM开源版
安装部署Camunda BPM有多种方式,基于Camunda独立web应用程序安装部署是最简单的一种方式,您只需要有tomcat即可. 本文档将指导您安装和配置Camunda独立web应用程序,快速体 ...
- 【故障公告】取代 memcached 的 redis 出现问题造成网站故障
6月19日开始,我们将博客站点的缓存服务器从 memcached 换成了 redis,稳定运行了3天,今天上午访问高峰突然出现问题,在 11:00-12:30 期间影响了网站的正常访问,由此给您带来麻 ...
- 使用Vite2+TypeScript4+Vue3技术栈,如何入手开发项目
前言 今天,我们使用Vite2.0+Vue3+TS来试玩一下,开发一个demo项目.实战 我们,打开Vite官方网站(https://cn.vitejs.dev/). Vite (法语意为 " ...