基于Django的Python应用—学习笔记—功能完善

一、让用户可以输入信息

创建forms.py

创建基于表单的页面的方法几乎与前面创建网页一样:定义一个 URL ,编写一个视图函数并编写一个模板。一个主要差别是,需要导入包含表单 的模块forms.py
from django import forms
from .models import Topic,Entry
class TopicForm(forms.ModelForm):class Meta:model = Topicfields = ['text']labels = {'text': ''}class EntryForm(forms.ModelForm):class Meta:model = Entryfields = ['text']labels = {'text': ''}widgets = {'text': forms.Textarea(attrs={'cols': 80})}

将其添加到

learning_logs/urls.py中:

"""定义learning_logs的URL模式"""
from django.urls import path
#从当前的urls.py模块所在的文件夹中导入视图
from . import views
#变量urlpatterns是一个列表,包含可在应用程序learning_logs中请求的网页
app_name = 'learning_logs'
urlpatterns = [#主页#第一个是正则表达式,r让Python将接下来的字符串视为原始字符串,引号正则表达式始于和终于何处#第二个实参指定了要调用的视图函数#第三个实参将这个URL模式的名称指定为indexpath(r'',views.index,name='index'),# 显示所有的主题path(r'topics/', views.topics, name='topics'),# 特定主题的详细页面path(r'^topics/(?P<topic_id>\d+)/$', views.topic, name='topic'),# 用于添加新主题的网页path(r'^new_topic/$', views.new_topic, name='new_topic'),# 用于添加新条目的页面path(r'^new_entry/(?P<topic_id>\d+)/$', views.new_entry, name='new_entry'),# 用于编辑条目的页面path(r'^edit_entry/(?P<entry_id>\d+)/$', views.edit_entry,name='edit_entry'),]

增加视图函数

learning_logs/views.py

from django.shortcuts import render
from django.http import HttpResponseRedirect
from django.urls import reverse
from .models import Topic, Entry
from .forms import TopicForm, EntryForm
# 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)
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)
def new_topic(request):"""添加新主题"""if request.method != 'POST':# 未提交数据:创建一个新表单form = TopicForm()else:# POST提交的数据,对数据进行处理form = TopicForm(request.POST)if form.is_valid():form.save()return HttpResponseRedirect(reverse('learning_logs:topics'))context = {'form': form}return render(request, 'learning_logs/new_topic.html', context)
def new_entry(request, topic_id):"""在特定的主题中添加新条目"""topic = Topic.objects.get(id=topic_id)if request.method != 'POST':# 未提交数据,创建一个空表单form = EntryForm()else:# POST提交的数据,对数据进行处理form = EntryForm(data=request.POST)if form.is_valid():new_entry = form.save(commit=False)new_entry.topic = topicnew_entry.save()return HttpResponseRedirect(reverse('learning_logs:topic',args=[topic_id]))context = {'topic': topic, 'form': form}return render(request, 'learning_logs/new_entry.html', context)
def edit_entry(request, entry_id):"""编辑既有条目"""entry = Entry.objects.get(id=entry_id)topic = entry.topicif request.method != 'POST':#   初次请求,使用当前条目填充表单form = EntryForm(instance=entry)else:# POST提交的数据,对数据进行处理form = EntryForm(instance=entry, data=request.POST)if form.is_valid():form.save()return HttpResponseRedirect(reverse('learning_logs:topic', args=[topic.id]))context = {'entry': entry, 'topic': topic, 'form': form}return render(request, 'learning_logs/edit_entry.html', context)

二、创建模板

新增三个模板

edit_entry.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
{% extends "learning_logs/base.html" %}
{% block content %}
<p><a href="{% url 'learning_logs:topic' topic.id %}">{{ topic }}</a></p>
<p>Edit entry:</p><form action="{% url 'learning_logs:edit_entry' entry.id %}" method='post'>
{% csrf_token %}
{{ form.as_p }}<button name="submit">save changes</button>
</form>
{% endblock content %}
</body>
</html>

new_entry.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
{% extends "learning_logs/base.html" %}
{% block content %}
<p><a href="{% url 'learning_logs:topic' topic.id %}">{{ topic }}</a></p>
<p>Add a new entry:</p>
<form action="{% url 'learning_logs:new_entry' topic.id %}" method='post'>
{% csrf_token %}
{{ form.as_p }}
<button name='submit'>add entry</button>
</form>
{% endblock content %}
</body>
</html>

new_topic.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
{% extends "learning_logs/base.html" %}
{% block content %}
<p>Add a new topic:</p><form action="{% url 'learning_logs:new_topic' %}" method='post'>{% csrf_token %}{{ form.as_p }}<button name="submit">add topic</button>
</form>
{% endblock content %}
</body>
</html>

在页面topics 中添加它们的链接:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Topics</title>
</head>
<body>
{% 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>{% empty %}
<li>No topics have been added yet.</li>{% endfor %}
</ul>
<a href="{% url 'learning_logs:new_topic' %}">Add a new topic:</a>{% endblock content %}
</body>
</html>

在页面topic中添加它们的链接:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
{% 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 %}{% endblock content %}
</ul>
</body>
</html>

三、运行效果

点击Topics

点击Add a new topic,可以增加Topic

返回结果:

点击Chess

再点击增加new  nentry,输入信息,点击添加

返回结果:

点击edit entry,修改内容

如图:输入修改的信息,点击save changes 保存修改

返回结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/635338.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Facebook的区块链之路:探秘数字货币的未来

近年来&#xff0c;Facebook一直在积极探索区块链技术&#xff0c;并逐渐将目光聚焦在数字货币领域。从推出Libra项目到改名为Diem&#xff0c;Facebook一直在寻求在数字货币领域取得突破性进展。本文将深入探讨Facebook的区块链之路&#xff0c;揭示其对数字货币未来发展的影响…

Red Hat Enterprise Linux 8.9 安装图解

引导和开始安装 选择倒计时结束前&#xff0c;通过键盘上下键选择下图框选项&#xff0c;启动图形化安装过程。需要注意的不同主板默认或者自行配置的固件类型不一致&#xff0c;引导界面有所不同。也就是说使用UEFI和BIOS的安装引导界面是不同的&#xff0c;如图所示。若手动调…

链表存数相加算法(leetcode第2题)

题目描述&#xff1a; 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。你可以假设除了数字 0 之外&#xff0c;这…

ZVB4/ZVB8罗德与施瓦茨ZVB8网络分析仪8GHz

德国罗德与施瓦茨ZVB8网络分析仪8GHz R&S ZVB8 网络分析仪通过两个或四个测试端口提供高达 8 GHz 的高测量速度。ZVB8 结合了出色的性能、轻巧的设计和紧凑的设计。智能和用户友好的功能提供了最大的操作便利性。R&S ZVB8 网络分析仪可以轻松处理涉及多端口和平衡测量的…

2.C语言——控制语句

控制语句 1.分支语句/判断语句if 语句if...else 语句if...else if...else语句 switch语句 2.循环语句 while 语句 do...while 语句 for 语句 3.转向语句 break continue go to 1.分支语句/判断语句 if 语句 if(boolean_expression) { /* 如果布尔表达式为真将执行的语句 */ } …

UI开发布局-HarmonyOS应用UI开发布局

UI页面的构建不用再像Android开发过程中在.xml文件中书写&#xff0c;可直接在页面上使用声明式UI的方式按照布局进行排列&#xff0c;构建应用的页面。 如下代码使用Row、Column构建一个页面布局&#xff0c;在页面布局中添加组件Text、Button&#xff0c;共同构成页面&#…

C#使用DateTime.Now静态属性动态获得系统当前日期和时间

目录 一、实例 1.源码 2.生成效果 二、相关知识点 1.Thread类 &#xff08;1&#xff09;Thread.Sleep()方法 &#xff08;2&#xff09;Thread(ThreadStart) &#xff08;3&#xff09;IsBackground &#xff08;4&#xff09;Invoke( &#xff09; 2.CreateGrap…

前端打同一个包可以从测试晋升到生产的配置方案

前端打同一个包从测试晋升到生产环境的方案&#xff0c;是一种高效、可靠且易于维护的部署方式。在这种方案中&#xff0c;前端代码在开发完成后&#xff0c;经过测试验证无误后&#xff0c;可以直接打包部署到生产环境&#xff0c;无需进行额外的配置或修改。这样可以减少部署…

面试题:40亿个QQ号,限制1G内存,如何去重?

文章目录 概要什么是BitMap&#xff1f;有什么用&#xff1f;什么是布隆过滤器&#xff0c;实现原理是什么&#xff1f;应用场景如何使用 概要 40亿个unsigned int&#xff0c;如果直接用内存存储的话&#xff0c;需要&#xff1a; 4*4000000000 /1024/1024/1024 14.9G &…

关于datagrip的一个错误。Unexpected update count received (Actual: 3, Expected: 1).

这一行原本的值是<null><null><null>,现在我们把它修改为1,114&#xff0c;无名氏&#xff0c;但却报错。 这是对应的sql语句&#xff0c;原因在于有三行全为 <null><null><null>&#xff0c;where无法指定是哪一行&#xff0c;所以看起来…

工程师职称评审的流程

职称评审是对专业技术人员的专业考核评级&#xff0c;通过公平、工作的评审工作选拔优秀且专业的人才。职称评审的流程通常包括以下几个步骤&#xff1a; 公告评审标准和要求&#xff1a;评审机构根据不同行业、专业和职业领域的要求&#xff0c;制定相应的评审标准和要求&…

Visual Studio中,每次新建文件都会自动出现提前设置好的头文件配置方法

主要是修改 newcfile.cpp 文件&#xff0c;可以用everything或者Listary等软件直接搜索文件&#xff0c;直接跳到第4步 1.图标右击——>打开文件所在位置 2.到达IDE地址后在当前目录下找VC文件夹 3.再找 VCProjectItems 文件夹——newcfile.cpp文件 4.用记事本打开&#xff…

市场复盘总结 20240119

仅用于记录当天的市场情况&#xff0c;用于统计交易策略的适用情况&#xff0c;以便程序回测 短线核心&#xff1a;不参与任何级别的调整&#xff0c;采用龙空龙模式 昨日主题投资 连板进级率 11/39 28.2% 二进三&#xff1a; 进级率低 43% 最常用的二种方法&#xff1a; 方…

AWS 专题学习 P5 (Classic SA、S3)

文章目录 Classic Solutions Architecture无状态 Web 应用程序&#xff1a;WhatIsTheTime.com背景 & 目标架构演进Well-Architected 5 pillars 有状态的 Web 应用程序&#xff1a;MyClothes.com背景 & 目标架构演进总结 有状态的 Web 应用程序&#xff1a;MyWordPress.…

安捷伦E8361C 网络分析仪67GHz

安捷伦E8361C 网络分析仪 E8361C 是 Agilent 的 67 GHz 网络分析仪。网络分析仪是一种功能强大的仪器&#xff0c;可以以无与伦比的精度测量射频设备的线性特性。许多行业使用网络分析仪来测试设备、测量材料和监控信号的完整性。附加功能&#xff1a; 10 MHz 至 67 GHz 94 dB…

强缓存、协商缓存(浏览器的缓存机制)是么子?

文章目录 一.为什么要用强缓存和协商缓存&#xff1f;二.什么是强缓存&#xff1f;三.什么是协商缓存&#xff1f;四.总结 一.为什么要用强缓存和协商缓存&#xff1f; 为了减少资源请求次数&#xff0c;加快资源访问速度&#xff0c;浏览器会对资源文件如图片、css文件、js文…

vue3-侦听器

侦听器 计算属性允许我们声明性地计算衍生值。 需求在状态变化时进行一些操作&#xff0c;比如更改 Dom,根据异步操作结果去修改另外的数据状态。 watch 监听异步请求结果 <script lang"ts" setup> import { ref, watch } from "vue"const ques…

unity 编辑器开发一些记录(遇到了更新)

1、封装Toggle组件 在用toggle等会状态改变的组件时&#xff0c;通过select GUILayout.Toggle(select, text, options)通常是这样做&#xff0c;但是往往有些复杂编辑器需求&#xff0c;当select变化时需要进行复杂的计算&#xff0c;所以不希望每帧去计算select应该的信息。…

虹科分享 | 汽车技术的未来:Netropy如何测试和确保汽车以太网的性能

文章速览&#xff1a; 什么是汽车以太网&#xff1f;汽车以太网的用途是什么&#xff1f;汽车以太网的测试要求是什么&#xff1f;流量生成如何帮助测试汽车以太网&#xff1f; 如今汽车不再是单纯的代步工具&#xff0c;把人从A点带到B点&#xff0c;同时还配备了车载信息娱乐…

java打包及上传到私服务

一、准备Maven私服Nexus 添加saas.maven 仓库地址&#xff1a;http://192.168.31.109:8081/repository/saas.maven 二、新建SpringBoot项目com.saas.pdf 添加类&#xff1a;PdfUtil.java package com.saas.pdf;public class PdfUtil {public static void Save(String fileP…