VSCODE中使用Django处理后端data和data models

news2024/11/16 12:25:24

链接: Python and Django tutorial in Visual Studio Code

MVC的理解

在实际的程序中采用MVC的方式进行任务拆分。 Model(模型)负责封装应用程序的数据和业务逻辑部分。Model包含数据结构,数据处理逻辑以及相关的操作方法,用于对数据进行增删改查等操作。Model(模型)View (用户界面)和Controller(用户交互逻辑)相分离的方式有下面的好处:

1,相同业务逻辑可以被不同的View(视图)复用。

2,Controller(控制器)通过用户的输入更新模型(Model)的状态,模型(Model)的变化可以自动反应在关联的视图(View)上。

3,业务规则和数据访问(Model部分)独立于具体的展示形式(View)和用户交互流程(controll), 让代码更加可维护,可复用。便于编程的标准化和工程化。

Django的解决方案

在很多实际的程序中,需要使用存储与数据库的数据。Django通过使用Models来简化对数据库中数据的使用。Django中的Model是python的类,来源于“django.db.models.Model”。原则上代表特定的数据库对象(通常为 表单)。相关的类在 app目录下的 models.py文件里进行定义。

Django通过在程序中定义的models来管理数据库。Django通过“migratons”功能来自动完成与数据库的交互。基本过程如下:

  1. 更改models.py文件中的models。
  2. 运行Terminal命令“python manage.py makemigrations”。在migrations文件夹下面创建用于更新数据库状态的脚本。
  3. 运行terminal命令 “python manage.py migrate”,执行脚本更新数据库。

Django可以负责数据库的管理,作为编程人员,我们只需要关注在models.py中定义的models就可以了。

数据库(包括db.sqlite3)提供直接修改的功能,但是这会造成数据的不一致。强烈建议: 修改models,运行 makemigrations, 运行 migrate。

数据库选型

Django默认使用db.sqlite3文件作为数据库,该数据库适用于开发阶段。根据Sqlit.org官网When to use SQLite ,SQLite使用于日访问量在10万以下的应用。另外 SQLite不适用于多服务器场景。

基于以上原因,生产环境建议使用 PostgreSQL, MySQL, and SQL Server. Django官方文档 Database setup. 云服务文档 Azure SDK for Python .

定义模型(model)

Django中的Model是python的类,来源于“django.db.models.Model”。相关的类在 app目录下的 models.py文件里进行定义。在数据库中每一个Model自动给予编号(字段名id)。其他的字段作为类的属性存在。属性的类型源自django.db.models的类型包括,CharField  (limited text) ,   TextField  (unlimited text),EmailField, URLField, IntegerField, DecimalField, BooleanField, DateTimeField, ForeignKey, ManyToMany等。(详见Django文档 Model field reference .)

每个字段都有属性定义如max_length.  “blank=True”代表该字段为可选项;“null=True”代表可以没有数据。另外还有“choice”属性,可以限制输入来源。

示例

在hello目录下的model.py文件中定义“LogMessage”类。

from django.db import models
from django.utils import timezone

class LogMessage(models.Model):
    message = models.CharField(max_length=300)
    log_date = models.DateTimeField("date logged")

    def __str__(self):
        """Returns a string representation of a message."""
        date = timezone.localtime(self.log_date)
        return f"'{self.message}' logged on {date.strftime('%A, %d %B, %Y at %X')}"

在模型中可以包含使用数据计算出返回值的方法。 models中通常包括__str__方法,用于描述类和实例。

迁移数据库(创建数据库)

由于新创建了model,需要更新数据库。在启动项目虚拟环境的Terminal中运行下面的命令。

python manage.py makemigrations
python manage.py migrate

 在hello/migrations目录下,创建0001_initial.py文件。db.sqlite3数据库文件还不会检查。

通过model使用数据库

通过model和migrate机制,可以通过models来管理数据。在本节中新建form页面,进行注册。修改home页面,显示上述信息。

建立log message页面,输入数据

1,在hello目录下(app目录),创建forms.py文件。代码如下,代码目的:创建一个form

from django import forms
from hello.models import LogMessage

class LogMessageForm(forms.ModelForm):
    class Meta:
        model = LogMessage
        fields = ("message",)   # NOTE: the trailing comma is required

2,在hello/templates/hello中创建log_message.html文件。定义log_message页面信息。有输入框和按钮。

{% extends "hello/layout.html" %}
{% block title %}
    Log a message
{% endblock %}
{% block content %}
    <form method="POST" class="log-form">
        {% csrf_token %}
        {{ form.as_p }}
        <button type="submit" class="save btn btn-default">Log</button>
    </form>
{% endblock %}

3,更新CSS文件,定义输入框的宽度

input[name=message] {
    width: 80%;
}

4,hello/urls.py中增加新页面的路径

path("log/", views.log_message, name="log"),

5,在hello/view.py中定义log_message子例程。定义log_message视图。完成两个任务post任务,接收输入form.save,增加时间戳,保存到数据库message.save(). 没有输入时,渲染log_message.html页面(如else语句)。

# Add these to existing imports at the top of the file:
from django.shortcuts import redirect
from hello.forms import LogMessageForm
from hello.models import LogMessage

# Add this code elsewhere in the file:
def log_message(request):
    form = LogMessageForm(request.POST or None)

    if request.method == "POST":
        if form.is_valid():
            message = form.save(commit=False)
            message.log_date = datetime.now()
            message.save()
            return redirect("home")
    else:
        return render(request, "hello/log_message.html", {"form": form})

6,在home页面增加log_message的html元素。hello/templates/hello/layout.html, 在“navbar”内增加下面内容。(在home后显示Log_message)

One more step before you're ready to try everything out! In templates/hello/layout.html, add a link in the "navbar" div for the message logging page:

<!-- Insert below the link to Home -->
<a href="{% url 'log' %}" class="navbar-item">Log Message</a>

7,运行程序,结果如下。

Django tutorial: the message logging page added to the app

8,输入信息,点击按钮。可以多输入几次。可以使用SQLite浏览器查看创建的数据。

9,停止程序运行。完成后续home页面显示工作。

建立数据显示页面

10,更改home.html

{% extends "hello/layout.html" %}
{% block title %}
    Home
{% endblock %}
{% block content %}
    <h2>Logged messages</h2>

    {% if message_list %}
        <table class="message_list">
            <thead>
            <tr>
                <th>Date</th>
                <th>Time</th>
                <th>Message</th>
            </tr>
            </thead>
            <tbody>
            {% for message in message_list %}
                <tr>
                    <td>{{ message.log_date | date:'d M Y' }}</td>
                    <td>{{ message.log_date | time:'H:i:s' }}</td>
                    <td>
                        {{ message.message }}
                    </td>
                </tr>
            {% endfor %}
            </tbody>
        </table>
    {% else %}
        <p>No messages have been logged. Use the <a href="{% url 'log' %}">Log Message form</a>.</p>
    {% endif %}
{% endblock %}

11, 修改CSS文件 site.css

.message_list th,td {
    text-align: left;
    padding-right: 15px;
}

12,修改Views.py 导入相关模块。

from django.views.generic import ListView

13, views.py中,创建HomeListView类,

# Remove the old home function if you want; it's no longer used

class HomeListView(ListView):
    """Renders the home page, with a list of all messages."""
    model = LogMessage

    def get_context_data(self, **kwargs):
        context = super(HomeListView, self).get_context_data(**kwargs)
        return context

14,修改hello/urls.py引入数据model

from hello.models import LogMessage

15, urls.py 中查询5个历史数据。

home_list_view = views.HomeListView.as_view(
    queryset=LogMessage.objects.order_by("-log_date")[:5],  # :5 limits the results to the five most recent
    context_object_name="message_list",
    template_name="hello/home.html",
)

16,还是在同一个文件中,修改path"" ,更改为home_list_view。不再使用原来的Hometemplate.

    # Replace the existing path for ""
    path("", home_list_view, name="home"),

17, 运行检查结果。

遇到的小问题:

home.html文件中,VSCODE自动将几行放到一行。为了正确换行增加注释<!--demo-->来强制分行。

小结:model.py, form.py *.html, site.css, urls.py 为相关变化的文件。

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

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

相关文章

c#创建安装windows服务

背景:最近在做设备数据对接采集时,遇到一些设备不是标准的Service-Client接口,导致采集的数据不够准确;比如设备如果中途开关机后,加工的数量就会从0开始重新计数,因此需要实时监控设备的数据,进行叠加处理;考略到工厂设备比较多,实时监听接口的数据为每秒3次,因此将…

HDFS中常用的Shell命令 全面且详细

HDFS中常用的Shell命令目录 一、ls命令 二、mkdir 命令 三、put命令 四、get命令 五、mv命令 六、rm命令 七、cp命令 八、cat命令 前言 安装好hadoop环境之后&#xff0c;可以执行hdfs相关的shell命令对hdfs文件系统进行操作&#xff0c;比如文件的创建、删除、修改文…

探索Promise异步模式抽象的变体——Promise.all篇

本人编程小白一枚&#xff0c;希望多多包涵~ 如果阅读有疑问的话&#xff0c;欢迎评论或私信&#xff01;&#xff01; 本人会很热心的阐述自己的想法&#xff01;谢谢&#xff01;&#xff01;&#xff01; 文章目录 异步揭示原理Promise.race未完待续&#xff08;……&#x…

问题:Spark SQL 读不到 Flink 写入 Hudi 表的新数据,打开新 Session 才可见

博主历时三年精心创作的《大数据平台架构与原型实现&#xff1a;数据中台建设实战》一书现已由知名IT图书品牌电子工业出版社博文视点出版发行&#xff0c;点击《重磅推荐&#xff1a;建大数据平台太难了&#xff01;给我发个工程原型吧&#xff01;》了解图书详情&#xff0c;…

GoLand 2023:为Go开发者打造的智能IDE mac/win激活版

JetBrains GoLand 2023是一款专为Go语言开发者打造的集成开发环境(IDE)&#xff0c;它提供了强大的代码编辑、调试、测试和重构功能&#xff0c;帮助开发者更高效地开发Go应用程序。 GoLand 2023 软件获取 JetBrains GoLand 2023继承了JetBrains在开发工具领域的丰富经验&…

[论文阅读] 空间熵图像增强算法(Spatial Entropybased Contrast Enhancement in DCT)

[论文阅读] 空间熵图像增强算法(Spatial Entropybased Contrast Enhancement in DCT) 最近看到了一篇介绍传统图像增强算法的文章&#xff1a;基于空间熵的对比度增强算法 - 知乎 (zhihu.com)&#xff0c;从里面看到效果还不错&#xff0c;如下所示&#xff0c;因而详细看了下…

【8】证书公钥替换

0x01 问题描述 存在一个前置系统&#xff0c;数据包有登录信息。登录需要填入用户名&#xff0c;证书上传&#xff0c;私钥。如图&#xff1a; 提供数据包如下&#xff1a; POST /api/certLogin HTTP/1.1 Host: 192.168.11.153 Connection: keep-alive Content-Length: 934…

LLM之RAG实战(二十七)| 如何评估RAG系统

有没有想过今天的一些应用程序是如何看起来几乎神奇地智能的&#xff1f;这种魔力很大一部分来自于一种叫做RAG和LLM的东西。把RAG&#xff08;Retrieval Augmented Generation&#xff09;想象成人工智能世界里聪明的书呆子&#xff0c;它会挖掘大量信息&#xff0c;准确地找到…

vue项目设置的端口号运行后会自动加一问题解决

vue项目设置的端口号运行后会自动加一问题解决 主要原因是之前运行项目后没有完全的关闭服务&#xff0c;导致再次运行项目端口号被占用&#xff0c;自动加一&#xff01; 问题解决 打开任务管理器&#xff0c;在进程中找到node相关进程&#xff0c;右键结束任务

【Java EE初阶二十一】http的简单理解(二)

2. 深入学习http 2.5 关于referer Referer 描述了当前页面是从哪个页面跳转来的&#xff0c;如果是直接在地址栏输入 url(或者点击收藏夹中的按钮) 都是没有 Referer。如下图所示&#xff1a; HTTP 最大的问题在于"明文传输”,明文传输就容易被第三方获取并篡改. …

React之拖动组件的设计(一)

春节终结束了&#xff0c;忙得我头疼。终于有时间弄自己的东西了。今天来写一个关于拖动的实例讲解。先看效果&#xff1a; 这是一个简单的组件设计&#xff0c;如果用原生的js设计就很简单&#xff0c;但在React中有些事件必须要多考虑一些。这是一个系列的文章&#xff0c;…

【Vuforia+Unity】AR04-地面、桌面平面识别功能

不论你是否曾有过相关经验&#xff0c;只要跟随本文的步骤&#xff0c;你就可以成功地创建你自己的AR应用。 官方教程Ground Plane in Unity | Vuforia Library 这个功能很棒&#xff0c;但是要求也很不友好&#xff0c;只能支持部分移动设备&#xff0c;具体清单如下&#xf…

2024牛客寒假算法基础集训营5 -- EF soyorin的数组操作

题目大意&#xff1a; 思路解析&#xff1a; 我们可以发现偶数情况下&#xff0c;我们可以无限做 k n的操作&#xff0c;这样一定会让数组变为非降序数组。 但是奇数情况下&#xff0c;最后一个数没有办法发生变化&#xff0c;所以我们只能统计怎样在保证i--n为非降序情况下最…

ELK Stack 日志平台搭建

前言 最近在折腾 ELK 日志平台&#xff0c;它是 Elastic 公司推出的一整套日志收集、分析和展示的解决方案。 专门实操了一波&#xff0c;这玩意看起来简单&#xff0c;但是里面的流程步骤还是很多的&#xff0c;而且遇到了很多坑。在此记录和总结下。 本文亮点&#xff1a;…

洛谷 P1028 [NOIP2001 普及组] 数的计算

说明&#xff08;6&#xff09; 求出后五个加本身得到总方案 参考代码and代码解读

redis复习笔记06(小滴课堂)

分布式锁核心知识介绍和注意事项 基于Redis实现分布式锁的几种坑 综合伪代码&#xff1a; 运行&#xff1a;

压缩感知常用的测量矩阵

测量矩阵的基本概念 在压缩感知&#xff08;Compressed Sensing&#xff0c;CS&#xff09;理论中&#xff0c;测量矩阵&#xff08;也称为采样矩阵&#xff09;是实现信号压缩采样的关键工具。它是一个通常为非方阵的矩阵&#xff0c;用于将信号从高维空间映射到低维空间&…

电商+支付双系统项目------实现电商系统中分类模块的开发!

本篇文章主要介绍一下这个项目中电商系统的分类模块开发。电商系统有很多模块&#xff0c;除了分类模块&#xff0c;还有用户模块&#xff0c;购物车模块&#xff0c;订单模块等等。上一篇文章已经讲了用户模块&#xff0c;这篇文章我们讲讲项目中的分类模块。 有的人可能会很…

解决docker中运行的jar包连不上前端程序

目录 检查端口映射 查看容器的 IP 地址 检查容器网络设置 防火墙和网络策略 前端程序配置 跨域资源共享 (CORS) 日志查看 连接问题通常涉及到网络配置和端口映射。确保你在 Docker 中运行的 JAR 包可以被前端程序访问&#xff0c;可以采取以下步骤来解决问题&#xff1a…

职业技能鉴定服务中心前端静态页面(官网+证书查询)

有个朋友想做职业技能培训&#xff0c;会发证书&#xff0c;证书可以在自己网站可查。想做一个这样的网站&#xff0c;而且要特别土&#xff0c;一眼看上去像xxx官方网站&#xff0c;像jsp .net技术开发的网站。用htmlcssjquery还原了这样子一个前端页面&#xff0c;这里分享给…