2024--Django平台开发-Django知识点(六)

day06 Django知识点

今日概要:

  • Form和ModelForm组件【使用】【源码】
  • 缓存【使用】
  • ORM【使用】
  • 其他:ContentTypes、Admin、权限、分页、信号等

1.Form和ModelForm组件

背景:某个公司后台管理项目。

  • 垃圾

    def register(request):""" 用户注册 """# 1.获取提交数据mobile = request.POST.get("mobile")sms = request.POST.get("sms")name = request.POST.get("name")age = request.POST.get("age")email = request.POST.get("email")password = request.POST.get("password")# 2.校验判断(10行)# all([mobile,sms])# 正则表达式# 3.业务逻辑代码
    
  • 框架(内置+第三方表单验证组件)

    <form method="post"><input type="text" name="mobile1" />{{form.mobile1}}<input type="text" name="sms" />{{form.sms}}<input type="submit" value="提交" />
    </form>
    
    class MyForm(Form):mobile1 = forms.CharField(reg="\d{11}", required=True)sms = forms.CharField(required=True)def register(request):""" 用户注册 """if request.method == "GET":# form = MyForm(instance={"mobile1":"18766666666","sms":"999"})form = MyForm()return render(request, "xxxxx.html",{"form":form})# 1.获取提交数据form = MyForm(request.POST)if form.is_valid():print(form.cleared_data)else:print(form.errors)# 3.业务逻辑代码return render(request, "xxxxx.html",{"form":form})
    

关于组件:表单验证、自动生成HTML标签、数据初始化(新建按钮、编辑按钮)、保持原来的数据。

1.1 初识Form组件

基于注册为例来进行测试。

详细见示例:1-form组件.zip

1.2 错误信息

在这里插入图片描述

1.3 展示所有的字段

对象和可迭代对象。

在这里插入图片描述

1.4 问题:关于样式

  • 手动操作

    class RegisterForm(forms.Form):v1 = forms.CharField(label="手机号",required=True,# max_length=19,# min_length=6,initial="武沛齐",validators=[RegexValidator(r'^\d{11}$', "手机号格式错误"), ],widget=forms.TextInput(attrs={"class":"form-control"}) # <input type="text" class="form-control"/>)v2 = forms.CharField(label="备注",required=True,widget=forms.Textarea(attrs={"class":"form-control"}) # <textarea class="form-control"/></textarea>)............
    
    {% for field in form %}<p>{{ field.label }} {{ field }} {{ field.errors.0 }}  </p>
    {% endfor %}
    
  • 自动操作(找到每个字段中的widget插件,再找到插件中的attrs属性,给他每个赋值**{“class”:“form-control”}**

    class RegisterForm(forms.Form):v1 = forms.CharField(...,widget=forms.TextInput)v2 = forms.CharField(...,widget=forms.TextInput(attrs={"v1":"123"}))def __init__(self,*args,**kwargs):super().__init__(self,*args,**kwargs)for name,field in self.fields.items():if name == "v1":continue if field.widget.attrs:field.widget.attrs.update({"class":"form-control"})else:field.widget.attrs = {"class":"form-control"}
    
    form = RegisterForm()                   # __init__
    form = RegisterForm(data=request.POST)  # __init__
    

1.5 问题:通用父类

class BootStrapForm(object):def __init__(self, *args, **kwargs):super().__init__(*args, **kwargs)for name, field in self.fields.items():field.widget.attrs = {"class": "form-control"}class LoginForm(BootStrapForm, forms.Form):user = forms.CharField(label="用户名", widget=forms.TextInput)pwd = forms.CharField(label="密码", widget=forms.TextInput)def login(request):form = LoginForm()return render(request, "login.html", {"form": form})
class BootStrapForm(forms.Form):def __init__(self, *args, **kwargs):# 不是找父类# 根据类的mro(继承关系),去找上个类# super().__init__(*args, **kwargs)for name, field in self.fields.items():field.widget.attrs = {"class": "form-control"}class LoginForm(BootStrapForm):user = forms.CharField(label="用户名", widget=forms.TextInput)pwd = forms.CharField(label="密码", widget=forms.TextInput)def login(request):form = LoginForm()return render(request, "login.html", {"form": form})

1.6 答疑

类的内部继承关系,是继续c3算法。

class A:passclass B:passclass C(B,A):pass# [<class '__main__.C'>, <class '__main__.B'>, <class '__main__.A'>, <class 'object'>]
print(C.mro())
老师 假如我们通过继承BootStrapForm实现批量给field对象添加{'class': 'form-control'}属性,那还能添加判断是否存在属性,若存在则更新;不存在再进行添加吗

1.7 ModelForm

  • 使用Form

    • 创建Form类 + 定义字段

      class LoginForm(forms.Form):user = forms.CharField(label="用户名", widget=forms.TextInput)pwd = forms.CharField(label="密码", widget=forms.TextInput)
      
    • 视图

      def login(request):if request.method == "GET":form = LoginForm()return render(request, "login.html", {"form": form})form = LoginForm(data=request.POST)if not form.is_valid():# 校验失败return render(request, "login.html", {"form": form})print(form.cleaned_data)# ...return HttpRespon("OK")
      
    • 前端

      <form>{% for field in form %}<p>{{ field.label }} {{ field }} {{ field.errors.0 }}</p>{% endfor %}
      </form>
      
  • 使用ModelForm

    • models.py

      class UserInfo(models.Model):name = models.CharField(verbose_name="用户名", max_length=32)age = models.IntegerField(verbose_name="年龄")email = models.CharField(verbose_name="邮箱", max_length=128)
      
    • 创建ModelForm

      class LoginForm(forms.ModelForm):mobile = forms.CharFiled(label="手机号")class Meta:model = models.UserInfofileds = ["name","age", "mobile"]
      
    • 视图使用

      def login(request):form = LoginModelForm()return render(request, "login.html", {"form": form})
      
    • 页面

      <form>{% for field in form %}<p>{{ field.label }} {{ field }} {{ field.errors.0 }}</p>{% endfor %}
      </form>
      

    注意:

    • 后续进行增伤改查是基于数据库Models中的某个表,推荐使用:ModelForm;

    • 如果要进行表单校验是与数据库的表无关直接使用Form。

1.8 ModelForm两个好的地方

1.8.1 初始化数据

  • Form

    class LoginForm(BootStrapForm, forms.Form):user = forms.CharField(label="用户名", widget=forms.TextInput)pwd = forms.CharField(label="密码", widget=forms.TextInput)
    
    def login(request):form = LoginForm(initial={"user": "武沛齐", "pwd": "123"})return render(request, "login.html", {"form": form})
    

    在这里插入图片描述

  • ModelForm

    class LoginModelForm(BootStrapForm, forms.ModelForm):mobile = forms.CharField(label="手机号", widget=forms.TextInput)class Meta:model = models.UserInfofields = ["name", "age", "mobile"]widgets = {"age": forms.TextInput,}labels = {"age": "x2",}def clean_name(self):value = self.cleaned_data['name']# raise ValidationError("....")return value
    
    def login(request):user_object = models.UserInfo.objects.filter(id=1).first()form = LoginModelForm(instance=user_object, initial={"mobile": "武沛齐"})return render(request, "login.html", {"form": form})
    

在这里插入图片描述

1.8.2 新建数据

  • Form组件

    def login(request):if request.method == "GET":form = LoginForm(initial={"user": "武沛齐", "pwd": "123"})return render(request, "login.html", {"form": form})form = LoginForm(data=request.POST)if not form.is_valid():return render(request, "login.html", {"form": form})# form.cleaned_data# 手动读取字典,保存至数据库# models.UserInfo.objects.create(name=form.cleaned_data['xx'], pwd=form.cleaned_data['yy'])return HttpResponse("成功")
    
  • ModelForm组件

    def login(request):if request.method == "GET":form = LoginForm()return render(request, "login.html", {"form": form})form = LoginForm(data=request.POST)if not form.is_valid():return render(request, "login.html", {"form": form})form.save() # 自动将数据新增到数据库return HttpResponse("成功")
    

1.8.3 更新数据

  • Form组件

    def login(request):if request.method == "GET":form = LoginForm(initial={"user": "武沛齐", "pwd": "123"})return render(request, "login.html", {"form": form})form = LoginForm(data=request.POST)if not form.is_valid():return render(request, "login.html", {"form": form})# form.cleaned_data# 手动读取字典,保存至数据库# models.UserInfo.objects.create(name=form.cleaned_data['xx'], pwd=form.cleaned_data['yy'])# models.UserInfo.objects.filter(id=1).update(name=form.cleaned_data['xx'], pwd=form.cleaned_data['y'])return HttpResponse("成功")
    
  • ModelForm组件

    def login(request):if request.method == "GET":form = LoginModelForm()return render(request, "login.html", {"form": form})user_object = model.UserInfo.object.filter(id=1).first()form = LoginModelForm(data=request.POST, instance=user_object)if not form.is_valid():return render(request, "login.html", {"form": form})form.save() # 更新id=1return HttpResponse("成功")
    

1.9 案例

  • 用户登录【Form】
  • 用户管理:增改【ModelForm】

2.Form相关源码

2.1 前置知识点

1.模板渲染

def login(request):# 1.打开login2.html文件读取内容 + 参数进行“替换” => 渲染  ==> 得到被替换完的字符串# 2.将字符串封装HttpReponse对象中,等待给用户返回。return render(request, 'login2.html', {"v1": "wupeiqi"})
def render(request, template_name, context=None, content_type=None, status=None, using=None):content = loader.render_to_string(template_name, context, request, using=using)#    template = get_template(template_name, using=using)#    content = template.render(context, request)return HttpResponse(content, content_type, status)
from django.shortcuts import HttpResponse
from django.template.loader import get_templatedef v1(request):template = get_template("v1.html")text = template.render({"text": "张开"}, request)print(text)return HttpResponse("OK")

2.插件相关的类

class Widget(metaclass=MediaDefiningClass):def __init__(self, attrs=None):self.attrs = {} if attrs is None else attrs.copy()def render(self, name, value, attrs=None, renderer=None):# name="user" value="zhangkai"  attrs=None   self.attrs={'class': "c1", "id": "xx1"}context = self.get_context(name, value, attrs)return self._render(self.template_name, context, renderer)def get_context(self, name, value, attrs):return {"widget": {"name": name, # "user""value": self.format_value(value), # "zhangkai""attrs": self.build_attrs(self.attrs, attrs), # {'class': "c1", "id": "xx1"}"template_name": self.template_name, # "django/forms/widgets/text.html"# "type":"text"},}class Input(Widget):input_type = None  # Subclasses must define this.template_name = "django/forms/widgets/input.html"def __init__(self, attrs=None):if attrs is not None:attrs = attrs.copy()self.input_type = attrs.pop("type", self.input_type)super().__init__(attrs)def get_context(self, name, value, attrs):# {"widget":{"name":}   }context = super().get_context(name, value, attrs)context["widget"]["type"] = self.input_typereturn contextclass TextInput(Input):input_type = "text"template_name = "django/forms/widgets/text.html"class PasswordInput(Input):input_type = "password"template_name = "django/forms/widgets/password.html"def __init__(self, attrs=None, render_value=False):super().__init__(attrs)self.render_value = render_valuedef get_context(self, name, value, attrs):if not self.render_value:value = Nonereturn super().get_context(name, value, attrs)
from django.shortcuts import HttpResponse
from django.template.loader import get_templatefrom django import formsdef v1(request):template = get_template("v1.html")text = template.render({"text": "张开"}, request)print(text)return HttpResponse("OK")def v2(request):# 1.执行 TextInput的 __init__方法obj = forms.TextInput(attrs={'class': "c1", "id": "xx1"})data_string = obj.render(name="user", value="张开")print(data_string)  # <input type='text' name='user' value="张开" class="c1"  id="xx1" />obj2 = forms.PasswordInput(attrs={'class': "c2"}, render_value=True)data_string = obj2.render(name="user", value="张开")print(data_string)return HttpResponse("OK")

3.init和new

class Foo(object):def __init__(self,name):self.name = name # 1. __new__ 去创建空对象 {}   -> 构造方法(创建对象)
# 2. __init__在对象中进行初始化 {"name":"武沛齐"}   -> 初始化方法
obj = Foo("武沛齐")
class Foo(object):def __init__(self, name):print("init初始化", self)self.name = namedef __new__(cls, *args, **kwargs):obj = super().__new__(cls)print("new创建对象", obj)return objinstance = Foo("wupeiqi")
print("得到对象", instance)

4.元类

说两句:

  • 默认情况下,类都是由type创建;

    class Info(object):city = "背景"def show(self):print("123")# Info = type("Info", (object,), {"city": "背景", "show": lambda self: print(123)})obj = Info()
    print(obj.city)
    obj.show()
    
  • 想要由其他的东西创建类,就可以使用metaclass进行指定。

    class Info(object,metaclass=其他):city = "背景"def show(self):print("123")
    
    class MyType(type):passclass Info(object, metaclass=MyType):city = "背景"def show(self):print("123")
    

类是有type创建的,类又可以进行实例化,去创建对象。

class MyType(type):# def __init__(self, *args, **kwargs):#     super().__init__(*args, **kwargs)def __new__(cls, *args, **kwargs):clazz = super().__new__(cls, *args, **kwargs)clazz.base_declare = [11, 22, 33]return clazzclass Info(object, metaclass=MyType):city = "背景"def show(self):print("123")print(Info.base_declare)

5.isintance

判断某个对象是否是某个类或其子类创建的对象。

class Foo(object):passclass Info(object):passobj1 = Foo()
obj2 = Foo()print(isinstance(obj1, Foo))
print(isinstance(obj2, Info))
class Field(object):passclass CharField(Field):passclass EmailField(Field):passclass ImageField(Field):passobj1 = CharField()
obj2 = EmailField()
obj3 = ImageField()print(isinstance(obj1, Field))
print(isinstance(obj2, Field))
print(isinstance(obj3, Field))

功能:很多对象可以判断这些对象,都是我Field的子类创建的对象。

2.2 Form组件-定义类

class DeclarativeFieldsMetaclass(MediaDefiningClass):"""Collect Fields declared on the base classes."""def __new__(mcs, name, bases, attrs):# Collect fields from current class and remove them from attrs.attrs["declared_fields"] = {key: attrs.pop(key)for key, value in list(attrs.items())if isinstance(value, Field)}new_class = super().__new__(mcs, name, bases, attrs)# Walk through the MRO.declared_fields = {}for base in reversed(new_class.__mro__):# Collect fields from base class.if hasattr(base, "declared_fields"):declared_fields.update(base.declared_fields)# Field shadowing.for attr, value in base.__dict__.items():if value is None and attr in declared_fields:declared_fields.pop(attr)new_class.base_fields = declared_fieldsnew_class.declared_fields = declared_fieldsreturn new_class
from django import formsclass Form(BaseForm, metaclass=DeclarativeFieldsMetaclass):passclass LoginForm(forms.Form):username = forms.CharField(label="用户名", required=True, widget=forms.TextInput)pwd = forms.CharField(label="密码", required=True, widget=forms.PasswordInput)

LoginForm类其实是由DeclarativeFieldsMetaclass创建的【new】【init】。

2.3 Form组件-创建类的对象

from django import formsclass LoginForm(forms.Form):username = forms.CharField(label="用户名", required=True, widget=forms.TextInput)pwd = forms.CharField(label="密码", required=True, widget=forms.PasswordInput)
form = LoginForm() # __new__   __init__
class BaseForm(RenderableFormMixin):field_order = Nonedef __init__(self,data=None,files=None,auto_id="id_%s",prefix=None,initial=None,....,field_order=None,renderer=None):self.fields = copy.deepcopy(self.base_fields)self.order_fields(  self.field_order if field_order is None else field_order   )self.initial = initial or {}renderer = get_default_renderer()self.renderer = rendererdef order_fields(self, field_order):if field_order is None:returnfields = {}for key in field_order:try:fields[key] = self.fields.pop(key)except KeyError:  # ignore unknown fieldspassfields.update(self.fields)  # add remaining fields in original orderself.fields = fieldsclass Form(BaseForm, metaclass=DeclarativeFieldsMetaclass):passclass LoginForm(forms.Form):username = forms.CharField(label="用户名", required=True, widget=forms.TextInput)pwd = forms.CharField(label="密码", required=True, widget=forms.PasswordInput)form = LoginForm(initial={})

2.4 Form组件-对象.字段

class LoginForm(forms.Form):username = forms.CharField(label="用户名", required=True, widget=forms.TextInput)pwd = forms.CharField(label="密码", required=True, widget=forms.PasswordInput)
def v3(request):form = LoginForm()print(form['username'])  # form.username <input type="text" name="username" required id="id_username">return HttpResponse("OK")
class Foo(object):def __getitem__(self, item):return 999obj = Foo()print(obj)
print(obj['xxxx'])
class BoundField:"A Field plus data"def __init__(self, form, field, name):self.form = form    # Form对象self.field = field  #  forms.CharField(label="用户名", required=True, widget=forms.TextInput)self.name = name    # "username"self.html_name = form.add_prefix(name)self.html_initial_name = form.add_initial_prefix(name)self.html_initial_id = form.add_initial_prefix(self.auto_id)if self.field.label is None:self.label = pretty_name(name)else:self.label = self.field.labelself.help_text = field.help_text or ""def __str__(self):"""Render this field as an HTML widget."""return self.as_widget() # <input type="text" name="username" required id="id_username">def as_widget(self, widget=None, attrs=None, only_initial=False):# 插件对象widget = widget or self.field.widgetif self.field.localize:widget.is_localized = Trueattrs = attrs or {}attrs = self.build_widget_attrs(attrs, widget)if self.auto_id and "id" not in widget.attrs:attrs.setdefault("id", self.html_initial_id if only_initial else self.auto_id)if only_initial and self.html_initial_name in self.form.data:# Propagate the hidden initial value.value = self.form._widget_data_value(self.field.hidden_widget(),self.html_initial_name,)else:value = self.value()# 字符串= 插件forms.TextInput对象.render  《input name='?' class=".."/>return widget.render(name=self.html_initial_name if only_initial else self.html_name,value=value,attrs=attrs,renderer=self.form.renderer,)

2.5 Form组件-可迭代对象

class MyForm(object):def __iter__(self):return iter([11, 22, 33, 44])obj = MyForm()
for item in obj:print(item)

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

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

相关文章

k8s之pod基础

k8s之pod基础 pod&#xff1a; pod是k8s中最小的资源管理组件 pod也是最小化运行容器化的应用的资源管理对象 pod是一个抽象的概念&#xff0c;可以理解为一个或者多个容器化应用的集合 在一个pod当中运行一个容器是最常用的方式 在pod当中同时运行多个容器&#xff0c;…

Qt QRadioButton单选按钮控件

文章目录 1 属性和方法1.1 文本1.2 选中状态1.3 自动排他1.4 信号和槽 2 实例2.1 布局2.2 代码实现 Qt中的单选按钮类是QRadioButton它是一个可以切换选中&#xff08;checked&#xff09;或未选中&#xff08;unchecked&#xff09;状态的单选按钮单选按钮常用在“多选一”的场…

分布式全局id

分布式全局id snowflake 算法是 twitter 开源的分布式 id 生成算法&#xff0c;采用 Scala 语言实现&#xff0c;是把一个 64 位的 long 型的 id&#xff0c;1 个 bit 是不用的&#xff0c;用其中的 41 bits 作为毫秒数&#xff0c;用 10 bits 作为工作机器 id&#xff0c;12 …

基于sprinmgboot实习管理系统源码和论文

随着信息化时代的到来&#xff0c;管理系统都趋向于智能化、系统化&#xff0c;实习管理也不例外&#xff0c;但目前国内仍都使用人工管理&#xff0c;市场规模越来越大&#xff0c;同时信息量也越来越庞大&#xff0c;人工管理显然已无法应对时代的变化&#xff0c;而实习管理…

人工智能复习

机器学习中线性回归和逻辑回归&#xff1a; 机器学习的分类&#xff1a; 监督学习和无监督学习&#xff0c;半监督学习 监督学习&#xff08;Supervised Learning&#xff09;&#xff1a; 监督学习是一种利用带有标签&#xff08;标记&#xff09;的数据进行训练的机器学习…

使用Windbg动态调试目标进程的一般步骤详解

目录 1、概述 2、将Windbg附加到已经启动起来的目标进程上&#xff0c;或者用Windbg启动目标程序 2.1、将Windbg附加到已经启动起来的目标进程上 2.2、用Windbg启动目标程序 2.3、Windbg关联到目标进程上会中断下来&#xff0c;输入g命令将该中断跳过去 3、分析实例说明 …

鸿蒙HarmonyOS学习手册_入门篇

鸿蒙HarmonyOS学习手册_入门篇 文章目录 鸿蒙HarmonyOS学习手册_入门篇入门快速入门开发准备基本概念UI框架应用模型工具准备 构建第一个ArkTS应用&#xff08;Stage模型&#xff09;-快速入门-入门创建ArkTS工程ArkTS工程目录结构&#xff08;Stage模型&#xff09;构建第一个…

Vue-10、Vue键盘事件

1、vue中常见的按键别名 回车 ---------enter <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>键盘事件</title><!--引入vue--><script type"text/javascript" src"h…

使用Vivado Design Suite平台板、将IP目录与平台板流一起使用

使用Vivado Design Suite平台板流 Vivado设计套件允许您使用AMD目标设计平台板&#xff08;TDP&#xff09;创建项目&#xff0c;或者已经添加到板库的用户指定板。当您选择特定板&#xff0c;Vivado设计工具显示有关板的信息&#xff0c;并启用其他设计器作为IP定制的一部分以…

以数据资产入表为抓手,推动数据资产化

在数字化时代&#xff0c;数据已经成为企业的重要资产。数据资产化是将数据视为一种有价值的资产&#xff0c;对其进行有效管理和利用的过程。而数据资产入表则是将数据资产纳入财务报表&#xff0c;以反映其价值和对企业财务状况的影响。本文亿信华辰 将深入探讨数据资产化与数…

每天学习一点点之 Spring Boot 1.x 升级 2.x 之 allowBeanDefinitionOverriding

最近组内大佬正在进行 Spring Boot 版本的升级&#xff0c;从 1.x 版本升级到 2.x 版本。在查看代码变更时&#xff0c;我注意到我之前编写的一个名为 ShardingRuleStrategy 的类被添加了 Primary 注解。这个类在原来的代码中被标记为 Component&#xff0c;同时也在 API 中被定…

k8s-----存储卷(数据卷)

容器内的目录和宿主机的目录进行挂载。 容器的生命状态是短站的&#xff0c;delete删除&#xff0c;k8s用控制创建的pod&#xff0c;delete相当于重启&#xff0c;容器的状态也会回复到初始状态。 一旦回到初始状态&#xff0c;所有的后天编辑的文件都会消失。 容器和节点之间创…

飞致云1panel v1.9.2 + 雷池WAF社区版 v4.0

可能有许多人都有这个需求&#xff1a;为自己的个人站点套上WAF&#xff0c;增加安全性&#xff0c;本文将介绍如何将1panel面板深度结合长亭雷池防火墙&#xff0c;实现为个人站点套上WAF并且自动续签ssl证书。 由于1panel和雷池WAF功能更新较快&#xff0c;上一篇文章已经不…

Kubernets(K8S)启动和运行01 快速入门

简介 Kubernetes is an open source orchestrator for deploying containerized applications. It was originally developed by Google, inspired by a decade of experience deploying scalable, reliable systems in containers via application-oriented APIs. Kubernete…

Open CASCADE学习|模块组成

OpenCASCADE由七个模块组成&#xff0c;分别如下&#xff1a; Foundation Classes基础类 Modeling Data 建模数据 Modeling Algorithms 建模算法 Visualization 可视化 Data Exchange 数据交换 Application Framework 程序框架 Kernel Classes 核心类 2D Geometry 二维几…

nginx(1.13.7)首次安装出现:【make: *** 没有规则可以创建“default”需要的目标“build” 问题】解决措施

目录 前言&#xff1a; 一.龙蜥&#xff08;Anolis&#xff09;操作系统上安装GCC 1.安装gcc 2.检验安装 二.安装出现 make&#xff1a; *** 没有规则可以创建“default”需要的目标“build” 问题 1.解压安装nginx 2.安装出现问题展示 3.解决措施 4.重新编译进行安装 5…

【Sublime Text】| 01——下载安装注册

系列文章目录 【Sublime Text】| 01——下载软件安装并注册 【Sublime Text】| 02——常用插件安装及配置 失败了也挺可爱&#xff0c;成功了就超帅。 文章目录 前言1. 下载2. 安装3. 注册3.1 通过修改应用程序注册3.2 通过替换应用程序注册 感谢 前言 轻量代码编辑器有很多 之…

国家发改委:《电能质量管理办法(暂行)》2024年4月1日起施行

中华人民共和国国家发展和改革委员会令 第8号 《电能质量管理办法(暂行)》已经2023年12月26日第7次委务会议审议通过,现予公布,自2024 年4月1日起施行。 主任 郑栅洁 2023年12月27日 电能质量管理办法&#xff08;暂行&#xff09; 第一章 总则 第一条 为加强电能质量管理&…

中小型企业如何在当今的商业环境中占得一席之地?

在电商新零售的浪潮下&#xff0c;一种全新的消费模式正在崭露头角——消费增值模式。这种模式不仅改变了消费者的购物体验&#xff0c;更在电商领域掀起了一场革命。本文将通过具体数据&#xff0c;为您揭示消费增值模式的魅力。 一、消费增值模式的奥秘 消费增值模式的核心在…

【DevOps-08-2】Harbor的基本操作

一、简要描述 Harbor作为镜像仓库,主要的交互方式就是将镜像上传到Harbor上,以及从Harbor上下载指定镜像 在传输镜像前,可以先使用Harbor提供的权限管理,将项目设置为私有项目,并对不同用户设置不同角色,从而更方便管理镜像。 二、Harbor添加用户和项目 1、添加Harbor用…