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

news2024/9/23 15:22:42

一、让用户可以输入信息

创建forms.py

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

class EntryForm(forms.ModelForm):
    class Meta:
        model = Entry
        fields = ['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模式的名称指定为index
	path(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 = topic
            new_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.topic
    if 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.coloradmin.cn/o/1397902.html

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

相关文章

【C语言】linux内核ipoib模块 - ipoib_intf_init

一、ipoib_intf_init函数定义 int ipoib_intf_init(struct ib_device *hca, u8 port, const char *name,struct net_device *dev, struct ipoib_dev_priv *priv) {struct rdma_netdev *rn netdev_priv(dev);int rc;priv->ca hca;priv->port port;rc rdma_init_netde…

NLP国内外大模型汇总列表[文心一言、智谱、百川、星火、通义千问、盘古等等]

国内外大模型汇总列表 中国大模型列表大全&#xff0c;全面收集有明确来源的大模型情况&#xff0c;包括机构、来源信息和分类等&#xff0c;随时更新。 Awesome family related to LLMS includes: https://github.com/wgwang/awesome-LLM-benchmarkshttps://github.com/wgw…

20240116使用Firefly的AIO-3399J的预编译的Android10固件确认RT5640声卡信息

20240116使用Firefly的AIO-3399J的预编译的Android10固件确认RT5640声卡信息 2024/1/16 17:55 百度&#xff1a;RK3399 ALC5640 RK3399 RT5640 BING&#xff1a;RK3399 ALC5640 LINE-IN接麦克风不会有声音的。 耳机只有右边有声音&#xff0c;但是偏小&#xff0c;可以通过音量…

Ubuntu 22.04 安装MySql

MySQL是非常常用的关系型数据库,无论是大厂还是小厂,都有它的身影。最大的优点是免费,安装起来也比较简单。 MySQL的架构 画了个简图,描述了下MySQL的架构。 其中的比较有趣的点在于连接池和存储引擎。连接池缓存了数据库和客户端的TCP连接,以减少建立连接的开销。存储引…

YOLOv3:算法与论文详细解读

【yolov1&#xff1a;背景介绍与算法精讲】 【yolo9000&#xff1a;Better, Faster, Stronger的目标检测网络】 目录 一、YOLOv3概述二、创新与改进三、改进细节3.1 多尺度特征3.2 不同尺度先验框3.3 完整的网络结构3.3 Darknet-53主干网络3.4 残差网络3.4.1 恒等映射3.4.2 网络…

【分布式技术】ELK大型日志收集分析系统

目录 步骤一&#xff1a;完成JAVA环境部署 步骤二&#xff1a;部署ES节点&#xff08;三台主机&#xff09; 步骤三&#xff1a;内核参数修改 步骤四&#xff1a;web端查看验证 步骤五&#xff1a;yum安装nginx 步骤六&#xff1a;完成logstash部署 步骤七&#xff1a;部…

docker安装 mysql 8.0.32

首先下载 mysql 其次如果虚拟机以前安过mysql 需要把mysql关闭 命令 永久关闭mysql 但是当前不生效 需要重启虚拟机 systemctl enable mysqld 如果不想重启虚拟机 可以执行 systemctl stop mysqld //指定版本 docker pull mysql:8.0.32 // 拉取最新的…

MyBatis 使用报错:org.xml.sax.SAXParseException 元素内容必须由格式正确的字符数据或标记组成

文章目录 前言问题分析解决方案方案一&#xff1a;使用 CDATA 区块&#xff0c;依然使用 “ > ” 或者 “ < ”方案二&#xff1a;使用转义字符 个人简介 前言 今天在使用 MyBatis 时出现报错&#xff1a; Caused by: org.xml.sax.SAXParseException: 元素内容必须由格式…

【人工智能平台】ubuntu22.04.3部署cube-studio

简介&#xff1a;本次安装是在虚拟机上进行&#xff0c;需要给虚拟机至少分配16GB&#xff0c;分配8GB时系统会卡死。 一、环境&#xff1a; 主机环境&#xff1a;win11&#xff08;全程科学&#xff09;vm虚拟机 虚拟机&#xff1a;ubuntu22.04.3桌面版&#xff08;新装&…

循环神经网络-单变量序列预测详解(pytorch)

参考博客 文章目录 &#xff08;1&#xff09;导入所需要的包&#xff08;2&#xff09;读取数据并展示&#xff08;3&#xff09;数据预处理&#xff08;4&#xff09;划分训练集和测试集&#xff08;5&#xff09;构建RNN回归模型&#xff08;6&#xff09;构造训练函数&…

EasyRecovery2024免费电脑数据恢复软件下载

easyrecovery是一款功能强大、易于使用的硬盘数据恢复软件。这款软件可以帮助用户非常方便地恢复丢失的数据。软件非常容易使用和高效的数据恢复。感兴趣的朋友们赶快来下载吧。 无论是因为意外删除、格式化、病毒感染、系统崩溃还是其他原因&#xff0c;该软件可以帮助您恢复…

说说集成学习的四种模型

集成学习概念 集成学习是机器学习中的一种思想&#xff0c;它通过多个模型的组合形成一个精度更高的模型&#xff0c;参与组合的 模型成为弱学习器&#xff08;弱学习器&#xff09;。训练时&#xff0c;使用训练集依次训练出这些弱学习器&#xff0c;对未知的样本进 行预测…

day15 DOM(1)

目录 DOM简介DOM作用能力使用场景 DOM树&#xff08;文档树&#xff09;DOM对象获取DOM对象根据CSS选择器来获取DOM元素其它获取DOM元素方法 操作元素内容操作元素属性 DOM简介 当网页被加载时&#xff0c;浏览器会创建页面的文档对象模型&#xff08;Document Object Model&a…

KKVIEW远程控制软件介绍

KKVIEW是一款全功能远程控制软件&#xff0c;可以随时随地访问家里或公司设备。KKVIEW,连接自由&#xff0c;KKVIEW旨在帮助用户在远程技术支持、远程办公、远程教育等领域便利的开展工作。 [主要功能] 远程桌面 一键远程显示远程桌面&#xff0c;一键开启远程控制&#xff0…

Linux环境下部署Tomcat(详细图文)

目录 一、下载地址 1.服务器不能联网情况下载 2.服务器能够联网 二、安装 1. Tomcat解压 2. Tomcat目录说明&#xff1a; 3. 重命名解压后的文件名 4. 配置环境变量 5. 修改配置文件 6.启动Tomcat 7.访问Tomcat 8. 停止Tomcat 一、下载地址 1.服务器不能联网情况下…

软考十大管理领域49个过程开展频次总结

1、仅开展一次或仅在预定义时点开展的项目管理过程 序号 过程 过程组 说明 1 制定项目章程 启动 项目章程尽量在整个项目期间保持不变 2 制订项目管理计划 计划 各种管理(程序性)计划和项目基准尽量在整个项目期间保持不变 3 规划范围管理 除规划沟通管…

读懂比特币—bitcoin代码分析(一)

最近美国 SEC 通过了比特币的 ETF申请&#xff0c;比特币究竟是个什么东西&#xff0c;从技术上来说&#xff0c;bitcoin 是一个点对点的电子现金系统&#xff0c;它可以实现分布式的记账&#xff0c;不依赖中心化的账务系统&#xff08;比如银行&#xff0c;支付宝&#xff09…

线上排查问题全套命令WIP(查看日志、端口占用、磁盘、CPU等)

线上排查问题全套命令WIP&#xff08;查看日志、端口占用、磁盘、CPU等&#xff09; 1 查看日志 1.1 less ①less xxx.log&#xff1a;查看日志文件 ②less -N xxx.log&#xff1a;带行号查看日志 ③g&#xff1a;定位到文件顶部 ④G&#xff08;shiftg键&#xff09;&am…

AI嵌入式K210项目(15)-安全散列算法加速器

文章目录 前言一、什么是SHA256&#xff1f;实验原理 二、K210的安全散列算法加速器三、实验过程总结 前言 K210内置了丰富的加速器&#xff0c;包括神经网络处理器 (KPU)&#xff0c;AES(高级加密加速器)&#xff0c;APU 麦克风阵列语音数据加速计算处理器&#xff0c;现场可…

【RabbitMQ】快速入门及基本使用

一、引言 1、、消息队列 Ⅰ、什么是消息队列&#xff1f; 消息队列是一种进程间通信或同一进程的不同线程间的通信方式&#xff0c;软件的贮列用来处理一系列的输入&#xff0c;通常是来自用户。消息队列提供了异步的通信协议&#xff0c;每一个贮列中的纪录包含详细说明的数据…