最近在看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最基本用法笔记的更多相关文章

  1. Python编程从入门到实践笔记——异常和存储数据

    Python编程从入门到实践笔记——异常和存储数据 #coding=gbk #Python编程从入门到实践笔记——异常和存储数据 #10.3异常 #Python使用被称为异常的特殊对象来管理程序执行期 ...

  2. Python编程从入门到实践笔记——文件

    Python编程从入门到实践笔记——文件 #coding=gbk #Python编程从入门到实践笔记——文件 #10.1从文件中读取数据 #1.读取整个文件 file_name = 'pi_digit ...

  3. Python编程从入门到实践笔记——类

    Python编程从入门到实践笔记——类 #coding=gbk #Python编程从入门到实践笔记——类 #9.1创建和使用类 #1.创建Dog类 class Dog():#类名首字母大写 " ...

  4. Python编程从入门到实践笔记——函数

    Python编程从入门到实践笔记——函数 #coding=gbk #Python编程从入门到实践笔记——函数 #8.1定义函数 def 函数名(形参): # [缩进]注释+函数体 #1.向函数传递信息 ...

  5. Python编程从入门到实践笔记——用户输入和while循环

    Python编程从入门到实践笔记——用户输入和while循环 #coding=utf-8 #函数input()让程序暂停运行,等待用户输入一些文本.得到用户的输入以后将其存储在一个变量中,方便后续使用 ...

  6. Python编程从入门到实践笔记——字典

    Python编程从入门到实践笔记——字典 #coding=utf-8 #字典--放在{}中的键值对:跟json很像 #键和值之间用:分隔:键值对之间用,分隔 alien_0 = {'color':'g ...

  7. Python编程从入门到实践笔记——if语句

    Python编程从入门到实践笔记——if语句 #coding=utf-8 cars=['bwm','audi','toyota','subaru','maserati'] bicycles = [&q ...

  8. Python编程从入门到实践笔记——操作列表

    Python编程从入门到实践笔记——操作列表 #coding=utf-8 magicians = ['alice','david','carolina'] #遍历整个列表 for magician i ...

  9. Python编程从入门到实践笔记——列表简介

    Python编程从入门到实践笔记——列表简介 #coding=utf-8 #列表——我的理解等于C语言和Java中的数组 bicycles = ["trek","cann ...

  10. Python编程从入门到实践笔记——变量和简单数据类型

    Python编程从入门到实践笔记——变量和简单数据类型 #coding=gbk #变量 message_1 = 'aAa fff' message_2 = 'hart' message_3 = &qu ...

随机推荐

  1. 个人&博客信息

                博客配置 服务器:无 配置链接:在博客园中安装皮肤 皮肤:GEEK by GUANGZAN           个人简介 本蒟蒻是广东中山人 如果您有一些问题,请发送邮件至mo ...

  2. 【算法】归并排序(Merge Sort)(五)

    归并排序(Merge Sort) 归并排序是建立在归并操作上的一种有效的排序算法.该算法是采用分治法(Divide and Conquer)的一个非常典型的应用.将已有序的子序列合并,得到完全有序的序 ...

  3. python之数据类型的内置方法(str, list)

    目录 字符串的内置方法 移除首尾指定字符 字母大小写相关操作 判断字符串的开头或结尾是否是指定字符 字符串特殊的输出方法 拼接字符串 替换指定字符 判断是否是纯数字 查找指定字符对应的索引值 文本位置 ...

  4. falcon-eye-本机系统监控WebUI

    falcon-eye是一个简单的单机版基于WebUI的Linux系统监控工具. 安装falcon-eye root@localhost:~# mkdir falcon-eye root@localho ...

  5. dd-文件系统内容映射

    复制文件并对原文件的内容进行转换和格式化处理. 语法 dd [OPTIONS]... 选项 if=filename 指定源文件. of=filename 指定目的文件. ibs=bytes 指定一个块 ...

  6. 新建Vue项目记得几个配置

    1.在APP.vue文件夹中进行CSS初始化 2.下载vuex,vue-router,并配置 3.关闭语法检查vue.config.js 4.按需引入组件库

  7. Java开发学习(一)----初识Spring及其核心概念

    一. Spring系统架构 1.1 系统架构图 Spring Framework是Spring生态圈中最基础的项目,是其他项目的根基. Spring Framework的发展也经历了很多版本的变更,每 ...

  8. Node.js安装与环境配置

    废话不多少直接上干货.坐车扶稳, 当然你要知道Node.js 是一个基于Chrome JavaScript 运行时建立的一个平台.其次Node.js是一个事件驱动I/O服务端JavaScript环境, ...

  9. Java学习-第一部分-第一阶段-第二节:变量

    变量 变量介绍 为什么需要变量 变量是程序的基本组成单位 不论是使用哪种高级程序语言编写程序,变量都是其程序的基本组成单位,比如: //变量有三个基本要素(类型+名称+值) class Test{ p ...

  10. SAP IDOC

    物料主数据 供应商主数据 价格档案 采购订单 采购计划协议 srm发货单 物料凭证 发票校验 发票校验过账或删除信息返回 CALL FUNCTION 'BAPI_INCOMINGINVOICE_PAR ...