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


    链接: Python and Django tutorial in Visual Studio Code

    链接: https://www.dedao.cn/ebook/reader?id=rEQKv6PKN7rEo2Gxg96ZjApyMvQVlw5q1rwXb14PJzDkYaReqd8n5LOmB8d7egBx

    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不适用于多服务器场景。

    基于以上原因,生产环境建议使用 PostgreSQLMySQL, 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”类。

    1. from django.db import models
    2. from django.utils import timezone
    3. class LogMessage(models.Model):
    4. message = models.CharField(max_length=300)
    5. log_date = models.DateTimeField("date logged")
    6. def __str__(self):
    7. """Returns a string representation of a message."""
    8. date = timezone.localtime(self.log_date)
    9. return f"'{self.message}' logged on {date.strftime('%A, %d %B, %Y at %X')}"

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

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

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

    1. python manage.py makemigrations
    2. 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

    1. from django import forms
    2. from hello.models import LogMessage
    3. class LogMessageForm(forms.ModelForm):
    4. class Meta:
    5. model = LogMessage
    6. fields = ("message",) # NOTE: the trailing comma is required

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

    1. {% extends "hello/layout.html" %}
    2. {% block title %}
    3. Log a message
    4. {% endblock %}
    5. {% block content %}
    6. <form method="POST" class="log-form">
    7. {% csrf_token %}
    8. {{ form.as_p }}
    9. <button type="submit" class="save btn btn-default">Logbutton>
    10. form>
    11. {% endblock %}

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

    1. input[name=message] {
    2. width: 80%;
    3. }

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

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

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

    1. # Add these to existing imports at the top of the file:
    2. from django.shortcuts import redirect
    3. from hello.forms import LogMessageForm
    4. from hello.models import LogMessage
    5. # Add this code elsewhere in the file:
    6. def log_message(request):
    7. form = LogMessageForm(request.POST or None)
    8. if request.method == "POST":
    9. if form.is_valid():
    10. message = form.save(commit=False)
    11. message.log_date = datetime.now()
    12. message.save()
    13. return redirect("home")
    14. else:
    15. 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:

    1. <a href="{% url 'log' %}" class="navbar-item">Log Messagea>

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

    Django tutorial: the message logging page added to the app

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

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

    建立数据显示页面

    10,更改home.html

    1. {% extends "hello/layout.html" %}
    2. {% block title %}
    3. Home
    4. {% endblock %}
    5. {% block content %}
    6. <h2>Logged messagesh2>
    7. {% if message_list %}
    8. <table class="message_list">
    9. <thead>
    10. <tr>
    11. <th>Dateth>
    12. <th>Timeth>
    13. <th>Messageth>
    14. tr>
    15. thead>
    16. <tbody>
    17. {% for message in message_list %}
    18. <tr>
    19. <td>{{ message.log_date | date:'d M Y' }}td>
    20. <td>{{ message.log_date | time:'H:i:s' }}td>
    21. <td>
    22. {{ message.message }}
    23. td>
    24. tr>
    25. {% endfor %}
    26. tbody>
    27. table>
    28. {% else %}
    29. <p>No messages have been logged. Use the <a href="{% url 'log' %}">Log Message forma>.p>
    30. {% endif %}
    31. {% endblock %}

    11, 修改CSS文件 site.css

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

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

    from django.views.generic import ListView
    

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

    1. # Remove the old home function if you want; it's no longer used
    2. class HomeListView(ListView):
    3. """Renders the home page, with a list of all messages."""
    4. model = LogMessage
    5. def get_context_data(self, **kwargs):
    6. context = super(HomeListView, self).get_context_data(**kwargs)
    7. return context

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

    from hello.models import LogMessage
    

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

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

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

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

    17, 运行检查结果。

    遇到的小问题:

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

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

  • 相关阅读:
    【笔者感悟】笔者的工作感悟【四】
    camera项目相关路径
    亚马逊、ebay、沃尔玛卖家打造爆款如何利用测评提高转化率?
    Hive - 检查分区 partition 是否存在
    中华传统文化题材网页设计主题:基于HTML+CSS设计放飞青春梦想网页【学生网页设计作业源码】
    【AIGC调研系列】llama 3与GPT4相比的优劣点
    开源开放,共建开发者新生态 | 2022 开发者生态汇
    python连接数据库
    mac有些软件无法删除,CleanMyMac X 4.14.3轻松帮你解决
    在Fedora 16 linux下安装USB无线网卡驱动rtl88x2bu
  • 原文地址:https://blog.csdn.net/weixin_44741835/article/details/136202771