最近在看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. C# Thread.Sleep 不精准的问题以及解决方案

    1.问题 最近在写一个熔断的 SDK,其中一种策略是根据慢请求来进行熔断. 我们在测试的时候,在对应 API 里面采用了 Thread.Sleep(ms) 来模拟慢请求. 设置的慢请求阈值是 RT 1 ...

  2. opencv学习之边缘检测

    边缘检测 是图像处理 过程中经常会涉及到的一个环节.而在计算机视觉 和 机器学习领域,边缘检测 用于 特征提取 和 特征检测 效果也是特别明显.而 openCV 中进行边缘检测的 算法 真是五花八门, ...

  3. 常见的邮箱服务器(SMTP,POP3)地址,端口

    163.com: POP3服务器地址:pop.163.com(端口:110) SMTP服务器地址:smtp.163.com(端口:25) sina.com: POP3服务器地址:pop3.sina.c ...

  4. Spring 源码(16)Spring Bean的创建过程(7)属性填充

    知识回顾 上一篇介绍了Spring中三级缓存的singletonObjects.earlySingletonObjects.singletonFactories,Spring在处理循环依赖时在实例化后 ...

  5. 好客租房40-react组件基础综合案例-案例需求分析

    实现 案例的数据 渲染评论列表 有评论 没有评论 暂无评论 获取评论信息 包括评论人和受控组件 发表评论 更新评论 //导入react import React from 'react' import ...

  6. Android——RelativeLayout

    代码:<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android= ...

  7. Educatinal CF #122(Div. 2) E . Spanning Tree Queries

    这一场其实有重大的意义,因为是除夕跨年,不过我FST掉大分了(ks) 题意:给你一个n点,m条边的带权图,q次询问,每次给你\(x\),每个边权为\(abs(E[i].w-x)\)答案为所有询问最小生 ...

  8. Python Django 功能模块

    Python Django模块 Django模块,是针对有django基础,对django功能进行模块化,方便下次使用. 一.注册模块 该注册采用邮箱验证,注册成功后会发送激活链接到邮箱. 邮箱验证参 ...

  9. SQL中如何修改数据库名、表名、列名?

    文章目录 1.SQL中如何修改数据库的名字? 2.SQL中如何修改表的名字? 3.SQL中如何修改列的名字? 4.SQL中如何修改列的数据类型?(未完成,待续) 1.SQL中如何修改数据库名? 语法 ...

  10. java基础题(4)

    5.4接口和抽象类 5.4.1实现抽象方法 描述: 已知抽象类Base中定义了calculate方法,该方法的计算过程依赖于sum()和avg(),而后两个方法均为抽象方法.要求定义Base的子类Su ...