Django之modelform使用

news2025/4/19 20:45:34

Django新增修改数据功能优化

目录

1.新增数据功能优化

2.修改数据功能优化

在我们做数据优化处理之前, 我们先回顾下传统的写法, 是如何实现增加修改的。

我们需要在templates里面新建前端的页面, 需要有新增还要删除, 比如说员工数据的新增, 那需要有很多个输入框, 那html结构里面, 都需要一一写入label, input, 选择框select里面配合option这样的组件。包括在后端写代码的时候, 在user.py那个views里面, 新增函数里面需要列出每一个字段并赋值, 就像以下代码:

name = request.POST.get("name")
age = request.POST.get("age")
gender = request.POST.get("gender")
salary = request.POST.get("salary")
dtime = request.POST.get("dtime")
depart = request.POST.get("depart")

这样的写法, 会显得非常冗余, 代码质量不高, 这篇文章, 我们就是要解决这种问题的, 优化新增和修改功能, 使代码质量变得更高, 不出现冗余代码的情况(前端和后端代码需要达成的一致要求)。
还要一点就是传统的写法, 它没有数据校验功能。

那这篇文章, 我们要讲的是modelform, 它可以很好的解决我们上面所提到的一些问题。

一、新增数据功能优化

我们打开user.py, 编辑以下代码:

class userInfoModelForm(forms.ModelForm):
    name = forms.CharField(min_length=2, label="姓名")
    class Meta:
        model = models.UserInfo
        # 在UserInfo表给里面指定的字段可使用
        # fields = ["name", "gender"] # 代表可以用name和gender这两个字段
        # 所有的UserInfo表格的字段都使用
        fields = "__all__"
        # 相当于代替了之前的以下代码:
        #name = request.POST.get("name")
        # age = request.POST.get("age")
        # gender = request.POST.get("gender")
        # salary = request.POST.get("salary")
        # dtime = request.POST.get("dtime")
        # depart = request.POST.get("depart")
        # 如果是想要某张表格的某个字段不想用, 那就可以用exclude
        # exclude = ["create_time"]

    # 由于我们的userInfoModelForm类继承了forms.ModelForm类, 所以我们写构造函数的时候, 需要传入*args, **kwargs这两个参数
    def __init__(self, *args, **kwargs):
        super(userInfoModelForm, self).__init__(*args, **kwargs)
        # item是属性名, field是属性值
        for item, field in self.fields.items():
            # 给输入框input增加一个class属性
            field.widget.attrs.update({"class": "form-control"})

然后我们继续写添加函数在user.py里面:

def user_add_modelform(request):
    if request.method == "GET":
        title = "添加信息2.0版本"
        form = userInfoModelForm()
        return render(request, "user/user_modelform.html", {"title": title, "form": form})
    # 接受表单提交过来的数据
    form = userInfoModelForm(request.POST)
    # 校验数据是否完整
    if form.is_valid():
        # 存储到数据库
        form.save()
        return redirect("/user/")
    # 如果数据不完整,则返回当前添加页面,展示错误信息
    return render(request, "user/user_modelform.html", {"form": form})

这里我们需要创建一个userInfoModelForm对象。并将它传给前端。需要注意的是form = userInfoModelForm(request.POST)这行代码, 里面需要加request.POST, 这个是为了接受表单提交过来的数据, 提交表单数据, 就是用的POST方法。所以这里必须要加request.POST。

我们在templates里面的user文件夹里, 创建user_modelform.html:

{% extends "index/model_tmp.html" %}
{% load static %}

{% block css %}
    <link rel="stylesheet" href="{% static 'css/layui.css' %}">
{% endblock %}

{% block content %}
    <div class="container">
        <h1>{{ title }}</h1>
        <form method="post">
            {% csrf_token %}
            {% for filed in form %}
{#       filed.label这里面就是获取我们在models.py里面创建表格里面的每一个字段里面有个verbose_name这个参数的值         #}
                <label for="exampleInputEmail1">{{ filed.label }}</label>
                {{ filed }}
                {#       展示错误信息         #}
                <span style="color: red">{{ filed.errors.0 }}</span>
                <br>
            {% endfor %}
            <button type="submit" class="btn btn-success">提交</button>
        </form>
    </div>
{% endblock %}

{% block js %}
    <script src="{% static "js/layui.js" %}"></script>
    <script>
        layui.use(function () {
            var laydate = layui.laydate;
            // 渲染
            laydate.render({
                // 这个id是员工入职时间的那个input输入框的id, 我们使用了modelform, 它会自动给我们每一个input都会生成一个id,
                // 格式为id_数据库字段名, 我们数据库员工表格里面的员工入职时间的那个字段是create_time, 所以id是id_create_time。
                elem: '#id_create_time'
            });
        });
    </script>
{% endblock %}

我们可以从代码中发现, 我们前端不用再一一的去写input, select那种输入框选择框了, filed就是input, 要展现label组件, 那就是filed.label, 如果提交表单之后有错误信息的话, 那就展示错误信息, 用filed.errors.0来展示, 还有, modelform它会帮我们每一个input输入框都会自动创建id, 就比如我们员工入职的时间那栏, id为id_create_time, 所以下面的script标签里面, 那个elem参数要写#id_create_time。

urls.py:

"""project_simple URL Configuration

The `urlpatterns` list routes URLs to views. For more information please see:
    https://docs.djangoproject.com/en/4.1/topics/http/urls/
Examples:
Function views
    1. Add an import:  from my_app import views
    2. Add a URL to urlpatterns:  path('', views.home, name='home')
Class-based views
    1. Add an import:  from other_app.views import Home
    2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
Including another URLconf
    1. Import the include() function: from django.urls import include, path
    2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path
from project_one.views import depart, user

urlpatterns = [
    # path('admin/', admin.site.urls),
    path("", depart.index),
    path("depart/", depart.depart),
    path("depart/add/", depart.add_depart),
    path("depart/<int:nid>/modify/", depart.depart_modify),
    path("depart/<int:nid>/del/", depart.del_depart),
    path("user/", user.user_info),
    path("user/add/", user.user_add),
    path("user/<int:nid>/modify/", user.user_modify),
    path("user/<int:nid>/del/", user.user_del),
    # 使用modelform来解决新增
    path("user/add/modelform", user.user_add_modelform)
]

完善user_list.html:

{% extends "index/model_tmp.html" %}

{% block content %}

    <div class="container">
        <a href="/user/add/" class="btn btn-success">添加信息</a>
        {#  这个是优化过的新增功能  #}
        <a href="/user/add/modelform" class="btn btn-warning">添加信息</a>
        <div class="panel panel-danger">
            <div class="panel-heading">
                <h3 class="panel-title">部门表</h3>
            </div>
            <div class="panel-body">
                <table class="table table-hover">
                    <thead>
                    <tr>
                        <th>ID</th>
                        <th>姓名</th>
                        <th>性别</th>
                        <th>薪水</th>
                        <th>年龄</th>
                        <th>入职时间</th>
                        <th>部门</th>
                    </tr>
                    </thead>
                    <tbody>
                    {% for data in user_list %}
                        <tr>
                            <th scope="row">{{ data.id }}</th>
                            <td>{{ data.name }}</td>
                            <td>{{ data.get_gender_display }}</td>
                            <td>{{ data.salary }}</td>
                            <td>{{ data.age }}</td>
                            <td>{{ data.create_time|date:"Y-m-d" }}</td>
                            <td>{{ data.department.title }}</td>
                            <td style="color: green">
                                <a href="/user/{{ data.id }}/modify/"><span style="color: green;" class="glyphicon glyphicon-pencil" aria-hidden="true"></span></a>
                                <a href="/user/{{ data.id }}/del/"><span style="color: red;" class="glyphicon glyphicon-trash" aria-hidden="true"></span></a>
                            </td>
                        </tr>
                    {% endfor %}
                    </tbody>
                </table>
            </div>
        </div>
    </div>
{% endblock %}

运行结果:

点击右边黄色按钮的添加信息

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

由此可见, 我们成功的添加了数据。

二、修改数据功能优化

修改功能, 和刚才那个新增功能, 有异曲同工之妙, 但也有天壤之别。

我们同样的打开user.py:

def user_modify_modelform(request, nid):
    # 获取要修改的那行数据
    obj = models.UserInfo.objects.filter(id=nid).first()
    if request.method == "GET":
        title = "修改信息2.0版本"
        # 这个代码的作用是当我们进入user_modelform.html界面的时候, 所有的输入框都会出现需要修改数据中的每一个字段内容里面的文字
        form = userInfoModelForm(instance=obj)
        return render(request, "user/user_modelform.html", {"title": title, "form": form})
    # 接受表单提交过来的数据
    form = userInfoModelForm(request.POST, instance=obj)
    # 校验数据是否完整
    if form.is_valid():
        # 存储到数据库
        form.save()
        return redirect("/user/")
    # 如果数据不完整,则返回当前修改页面,展示错误信息
    return render(request, "user/user_modelform.html", {"form": form})

这里面多了个obj = models.UserInfo.objects.filter(id=nid).first()这行代码, 因为我们修改某一行数据的时候, 需要先获取要修改的那行的所有数据, 并且展示到每一个输入框里面, 这样我们在做修改的时候, 才知道我们需要修改哪一行数据, 避免混淆。还有, 就是在创建userInfoModelForm对象的时候, 里面要传入instance参数, instance要传入的值就是我们获取到要修改的那行数据。其他的写法, 都和上面的新增数据一样。

这里面, 我们新增数据和修改数据, 都是用的同一个html文件, 都是user_modelform.html, 我们把它作为了新增和修改的公用页面。

urls.py:

"""project_simple URL Configuration

The `urlpatterns` list routes URLs to views. For more information please see:
    https://docs.djangoproject.com/en/4.1/topics/http/urls/
Examples:
Function views
    1. Add an import:  from my_app import views
    2. Add a URL to urlpatterns:  path('', views.home, name='home')
Class-based views
    1. Add an import:  from other_app.views import Home
    2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
Including another URLconf
    1. Import the include() function: from django.urls import include, path
    2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path
from project_one.views import depart, user

urlpatterns = [
    # path('admin/', admin.site.urls),
    path("", depart.index),
    path("depart/", depart.depart),
    path("depart/add/", depart.add_depart),
    path("depart/<int:nid>/modify/", depart.depart_modify),
    path("depart/<int:nid>/del/", depart.del_depart),
    path("user/", user.user_info),
    path("user/add/", user.user_add),
    path("user/<int:nid>/modify/", user.user_modify),
    path("user/<int:nid>/del/", user.user_del),
    path("user/add/modelform", user.user_add_modelform),
    path("user/<int:nid>/modify/modelform", user.user_modify_modelform)
]

完善user_list.html:

{% extends "index/model_tmp.html" %}

{% block content %}

    <div class="container">
        <a href="/user/add/" class="btn btn-success">添加信息</a>
        {#  这个是优化过的新增功能  #}
        <a href="/user/add/modelform" class="btn btn-warning">添加信息</a>
        <div class="panel panel-danger">
            <div class="panel-heading">
                <h3 class="panel-title">部门表</h3>
            </div>
            <div class="panel-body">
                <table class="table table-hover">
                    <thead>
                    <tr>
                        <th>ID</th>
                        <th>姓名</th>
                        <th>性别</th>
                        <th>薪水</th>
                        <th>年龄</th>
                        <th>入职时间</th>
                        <th>部门</th>
                    </tr>
                    </thead>
                    <tbody>
                    {% for data in user_list %}
                        <tr>
                            <th scope="row">{{ data.id }}</th>
                            <td>{{ data.name }}</td>
                            <td>{{ data.get_gender_display }}</td>
                            <td>{{ data.salary }}</td>
                            <td>{{ data.age }}</td>
                            <td>{{ data.create_time|date:"Y-m-d" }}</td>
                            <td>{{ data.department.title }}</td>
                            <td style="color: green">
                                {# 我们这里使用modelform来完成修改操作 #}
                                <a href="/user/{{ data.id }}/modify/modelform"><span style="color: green;" class="glyphicon glyphicon-pencil" aria-hidden="true"></span></a>
                                <a href="/user/{{ data.id }}/del/"><span style="color: red;" class="glyphicon glyphicon-trash" aria-hidden="true"></span></a>
                            </td>
                        </tr>
                    {% endfor %}
                    </tbody>
                </table>
            </div>
        </div>
    </div>
{% endblock %}

user.py完整代码(包含之前写过的所有内容):

from django.shortcuts import render, redirect
from django import forms

from project_one import models


# Create your views here.
def user_info(request):
    user_list = models.UserInfo.objects.all()
    return render(request, "user/user_list.html", {"user_list": user_list})


def user_add(request):
    if request.method == "GET":
        content = {
            "gender_choices": models.UserInfo.gender_choices,
            "depart_list": models.Department.objects.all()
        }
        return render(request, "user/user_add.html", content)
    name = request.POST.get("name")
    age = request.POST.get("age")
    gender = request.POST.get("gender")
    salary = request.POST.get("salary")
    dtime = request.POST.get("dtime")
    depart = request.POST.get("depart")
    models.UserInfo.objects.create(name=name, gender=gender, salary=salary, age=age, create_time=dtime,
                                   department_id=depart)
    return redirect("/user/")


def user_modify(request, nid):
    if request.method == "GET":
        data = models.UserInfo.objects.filter(id=nid).first()
        content = {
            "gender_choices": models.UserInfo.gender_choices,
            "depart_list": models.Department.objects.all()
        }
        return render(request, "user/user_modify.html", {"content": content, "data": data})
    name = request.POST.get("name")
    age = request.POST.get("age")
    gender = request.POST.get("gender")
    salary = request.POST.get("salary")
    dtime = request.POST.get("dtime")
    depart = request.POST.get("depart")
    models.UserInfo.objects.filter(id=nid).update(name=name, gender=gender, salary=salary, age=age, create_time=dtime,
                                                  department_id=depart)
    return redirect("/user/")


def user_del(request, nid):
    models.UserInfo.objects.filter(id=nid).delete()
    return redirect("/user/")


class userInfoModelForm(forms.ModelForm):
    name = forms.CharField(min_length=2, label="姓名")
    class Meta:
        model = models.UserInfo
        # 所以的UserInfo表格的字段都使用
        fields = "__all__"
        # 如果是想要某张表格的某个字段不想用, 那就可以用exclude
        # exclude = ["create_time"]

    # 由于我们的userInfoModelForm类继承了forms.ModelForm类, 所以我们写构造函数的时候, 需要传入*args, **kwargs这两个参数
    def __init__(self, *args, **kwargs):
        super(userInfoModelForm, self).__init__(*args, **kwargs)
        # item是属性名, field是属性值
        for item, field in self.fields.items():
            # 给输入框input增加一个class属性
            field.widget.attrs.update({"class": "form-control"})


def user_add_modelform(request):
    if request.method == "GET":
        title = "添加信息2.0版本"
        form = userInfoModelForm()
        return render(request, "user/user_modelform.html", {"title": title, "form": form})
    # 接受表单提交过来的数据
    form = userInfoModelForm(request.POST)
    # 校验数据是否完整
    if form.is_valid():
        # 存储到数据库
        form.save()
        return redirect("/user/")
    # 如果数据不完整,则返回当前添加页面,展示错误信息
    return render(request, "user/user_modelform.html", {"form": form})


def user_modify_modelform(request, nid):
    # 获取要修改数据的那行数据
    obj = models.UserInfo.objects.filter(id=nid).first()
    if request.method == "GET":
        title = "修改信息2.0版本"
        # 这个代码的作用是当我们进入user_modelform.html界面的时候, 所有的输入框都会出现需要修改数据中的每一个字段内容里面的文字
        form = userInfoModelForm(instance=obj)
        return render(request, "user/user_modelform.html", {"title": title, "form": form})
    # 接受表单提交过来的数据
    form = userInfoModelForm(request.POST, instance=obj)
    # 校验数据是否完整
    if form.is_valid():
        # 存储到数据库
        form.save()
        return redirect("/user/")
    # 如果数据不完整,则返回当前修改页面,展示错误信息
    return render(request, "user/user_modelform.html", {"form": form})

运行结果:

比如说, 我们修改第二行数据:

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

我们发现, 数据修改成功了。

好了, 这篇文章关于优化新增和修改功能的内容, 就到此为止了。

以上就是Django新增修改数据功能优化的所有内容了, 如果有哪里不懂的地方,可以把问题打在评论区, 欢迎大家在评论区交流!!!
如果我有写错的地方, 望大家指正, 也可以联系我, 让我们一起努力, 继续不断的进步.
学习是个漫长的过程, 需要我们不断的去学习并掌握消化知识点, 有不懂或概念模糊不理解的情况下,一定要赶紧的解决问题, 否则问题只会越来越多, 漏洞也就越老越大.
人生路漫漫, 白鹭常相伴!!!

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

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

相关文章

云轴科技ZStack入选中国人工智能产业发展联盟《大模型应用交付供应商名录》

2025年4月8日至9日&#xff0c;中国人工智能产业发展联盟&#xff08;以下简称AIIA&#xff09;第十四次全体会议暨人工智能赋能新型工业化深度行&#xff08;南京站&#xff09;在南京召开。工业和信息化部科技司副司长杜广达&#xff0c;中国信息通信研究院院长、中国人工智能…

写论文时降AIGC和降重的一些注意事项

‘ 写一些研究成果&#xff0c;英文不是很好&#xff0c;用有道翻译过来句子很简单&#xff0c;句型很单一。那么你会考虑用ai吗&#xff1f; 如果语句太正式&#xff0c;高级&#xff0c;会被误判成aigc &#xff0c;慎重选择ai润色。 有的话就算没有用ai生成&#xff0c;但…

AI 编程工具—如何在 Cursor 中集成使用 MCP工具

AI 编程工具—如何在 Cursor 中集成使用 MCP工具 这里我们给出了常用的MCP 聚合工具,也就是我们可以在这些网站找MCP服务 这是一个MCP Server共享平台,用户可以在上面发布和下载MCP Server配置。在这里可以选择你需要的MCP 服务。 如果你不知道你的mcp 对应的server 名称也不…

《软件设计师》复习笔记(12.2)——成本管理、配置管理

目录 一、项目成本管理 1. 定义 2. 主要过程 3. 成本类型 4. 其他概念 真题示例&#xff1a; 二、软件配置管理 1. 定义 2. 主要活动 3. 配置项 4. 基线&#xff08;Baseline&#xff09; 5. 配置库类型 真题示例&#xff1a; 一、项目成本管理 1. 定义 在批准…

Spring 中的 @Cacheable 缓存注解

1 什么是缓存 第一个问题&#xff0c;首先要搞明白什么是缓存&#xff0c;缓存的意义是什么。 对于普通业务&#xff0c;如果要查询一个数据&#xff0c;一般直接select数据库进行查找。但是在高流量的情况下&#xff0c;直接查找数据库就会成为性能的瓶颈。因为数据库查找的…

settimeout和setinterval区别

1. setTimeout&#xff1a;单次延迟执行 语法&#xff1a; const timeoutId setTimeout(callback, delay, arg1, arg2, ...); 核心功能&#xff1a;在指定的 delay&#xff08;毫秒&#xff09;后&#xff0c;执行一次 callback 函数。 参数&#xff1a; callback&#x…

Kaamel隐私与安全分析报告:Microsoft Recall功能评估与风险控制

本报告对Microsoft最新推出的Recall功能进行了全面隐私与安全分析。Recall是Windows 11 Copilot电脑的专属AI功能&#xff0c;允许用户以自然语言搜索曾在电脑上查看过的内容。该功能在初次发布时因严重隐私和安全问题而备受争议&#xff0c;后经微软全面重新设计。我们的分析表…

Thymeleaf简介

在Java中&#xff0c;模板引擎可以帮助生成文本输出。常见的模板引擎包括FreeMarker、Velocity和Thymeleaf等 Thymeleaf是一个适用于Web和独立环境的现代服务器端Java模板引擎。 Thymeleaf 和 JSP比较&#xff1a; Thymeleaf目前所作的工作和JSP有相似之处&#xff0c;Thyme…

o3和o4-mini的升级有哪些亮点?

ChatGPT是基于OpenAI GPT系列的高性能对话生成AI&#xff0c;经过多代迭代不断提升自然语言理解和生成能力。 在过去的一年中&#xff0c;OpenAI先后发布了GPT-4、GPT‑4.1及多种mini版本&#xff0c;为不同使用场景提供灵活选择。​ 随着用户需求向更高效、更精准的推理和视觉…

MATLAB 控制系统设计与仿真 - 36

鲁棒工具箱定义了个新的对象类ureal,可以定义在某个区间内可变的变量。 函数的调用格式为&#xff1a; p ureal(name,nominalvalue) % name为变量名,nominalValue为标称值&#xff0c;默认变化值为/-1 p ureal(name,nominalvalue,PlusMinus,plusminus) p ureal(name,nomin…

Spring数据访问全解析:ORM整合与JDBC高效实践

目录 一、Spring ORM集成深度剖析 &#x1f31f; ORM模块架构设计 核心集成特性&#xff1a; 整合MyBatis示例配置&#xff1a; 二、Spring JDBC高效实践指南 &#x1f31f; 传统JDBC vs Spring JDBC对比 &#x1f31f; JdbcTemplate核心操作示例 批量操作优化&#xf…

【HCIA】使用Access port实现简易的VLAN间通信

前言 当我们拥有一台三层交换机与两个vlan&#xff0c;我们可以使用简易的Vlanif配置实现VLAN间通信。 文章目录 前言1. 拓扑图2. 配置交换机3. 配置PC1与PC2的网络4. port link-type后记修改记录 1. 拓扑图 2. 配置交换机 <Huawei>system-view [Huawei]undo info-cent…

6.VTK 颜色

文章目录 概念RGB示例HSV示例 概念 RGB颜色系统&#xff1a;通过红(R)、绿(G)、蓝(B)三个颜色分量的组合来定义颜色。每个分量的取值范围是0到1&#xff0c;其中(0, 0, 0)代表黑色&#xff0c;而(1, 1, 1)代表白色。可以使用vtkProperty::SetColor(r, g, b)方法为Actor设置颜色…

shiro使用

shiro是apache提供的一种安全框架。他可以将登录&#xff0c;权限这一方面简单化。 使用shiro需要引入 <dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-core</artifactId><version>1.9.0</version></depend…

光谱相机的成像方式

光谱相机的成像方式决定了其如何获取物体的空间与光谱信息&#xff0c;核心在于分光技术与扫描模式的结合。以下是主要成像方式的分类解析&#xff1a; ‌一、滤光片切换型‌ ‌1. 滤光片轮&#xff08;Filter Wheel&#xff09;‌ ‌原理‌&#xff1a;通过旋转装有多个窄带…

算法-链表

小细节 初始化问题 我们这样子new一个ListNode 它里面的默认值是0&#xff0c;所以我们不能这样 如果我们为空&#xff0c;我们要返回null 节点结束条件判断&#xff08;多创建节点问题&#xff09; 参考示例3217 解析&#xff1a; 我的答案是多了一个无用节点 这是因为我每…

3.8/Q1,GBD数据库最新文章解读

文章题目&#xff1a;Regional and National Burden of Traumatic Brain Injury and Spinal Cord Injury in North Africa and Middle East Regions, 1990-2021: A Systematic Analysis for The Global Burden of Disease Study 2021 DOI&#xff1a;10.1007/s44197-025-00372-…

51单片机实验二:数码管静态显示

目录 一、实验环境与实验器材 二、实验内容及实验步骤 1.单个数码管显示 2.六个数码管依次从0~F变换显示 3.proteus仿真 一、实验环境与实验器材 环境&#xff1a;Keli&#xff0c;STC-ISP烧写软件,Proteus. 器材&#xff1a;TX-1C单片机&#xff08;STC89C52RC…

Linux驱动开发进阶(八)- GPIO子系统BSP驱动

文章目录 1、前言2、pinctrl子系统3、pinctrl bsp驱动4、gpio子系统5、gpio bsp驱动 1、前言 学习参考书籍以及本文涉及的示例程序&#xff1a;李山文的《Linux驱动开发进阶》本文属于个人学习后的总结&#xff0c;不太具备教学功能。 2、pinctrl子系统 在讨论gpio子系统时&…

【Windows】安装或者点击OneDrive没有任何反应的解决方案

一些Windows企业版或者神州网信政府版的策略会禁止使用OneDrive&#xff0c;双击OneDrive安装程序或者点击OneDrive软件会没有任何反应。通过下面的设置可以解除相关的限制。 1、修改注册表 打开注册表管理器。依次HKEYLOCAL_MACHINE\Software\Policies\Microsoft\Windows\One…