Django基础11(Django中form表单)

Form介绍 

  之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来。

与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户是否输入,输入的长度和格式等正不正确。如果用户输入的内容有错误就需要在页面上相应的位置显示显示对应的错误信息.。

Django form组件就实现了上面所述的功能。

总结一下,其实form组件的主要功能如下:

  • 生成页面可用的HTML标签
  • 对用户提交的数据进行校验
  • 保留上次输入内容

普通的登录

views.py

def login(request):error_msg = ""if request.method == "POST":username = request.POST.get("username")pwd = request.POST.get("pwd")if username == "SKS" and pwd == "1366768":return HttpResponse("OK")else:error_msg = "用户名或密码错误"return render(request, "login.html", {"error_msg": error_msg})

login.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="x-ua-compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1"><title>login</title><style>.error {color: red;}</style>
</head>
<body>
<form action="/login/" method="post">{% csrf_token %}<p><label for="username">用户名</label><input type="text" name="username" id="username"></p><p><label for="pwd">密码</label><input type="password" name="pwd" id="pwd"><span class="error"></span></p><p><input type="submit"><span class="error">{{ error_msg }}</span></p>
</form>
</body>
</html>

使用form组件

views.py

先定义好一个LoginForm类。

# 定义一个form组件类
class LoginForm(forms.Form):# 验证的字段及条件username = forms.CharField(min_length=8, label="用户名")pwd = forms.CharField(min_length=6, label="密码")def login2(request):# 存储错误信息error_msg = ""# 实例化对象form_obj = LoginForm()# 判断前端页面请求是否是POST请求if request.method == "POST":# 将数据传入form组件类中form_obj = LoginForm(request.POST)# 存储的正确信息if form_obj.is_valid():username = form_obj.cleaned_data.get("username")pwd = form_obj.cleaned_data.get("pwd")if username == "SKS" and pwd == "1866768":return HttpResponse("OK")else:error_msg = "用户名或密码错误"return render(request, "login2.html", {"form_obj": form_obj, "error_msg": error_msg})

login2.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="x-ua-compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1"><title>login</title><style>.error {color: red;}</style>
</head>
<body>
<form action="/login2/" method="post" novalidate>{% csrf_token %}<p>{{ form_obj.username.label }}{{ form_obj.username }}<span class="error">{{ form_obj.username.errors.0 }}</span></p><p>{{ form_obj.pwd.label }}{{ form_obj.pwd }}<span class="error">{{ form_obj.pwd.errors.0 }}</span></p><p><input type="submit"><span class="error">{{ error_msg }}</span></p>
</form>
</body>
</html>

看网页效果发现 也验证了form的功能:
• 前端页面是form类的对象生成的                                      -->生成HTML标签功能
• 当用户名和密码输入为空或输错之后 页面都会提示        -->用户提交校验功能
• 当用户输错之后 再次输入 上次的内容还保留在input框   -->保留上次输入内容

Form组件

常用字段演示

initial

初始值,input框里面的初始值。

# 定义一个类继承forms.Form
class LoginForm(forms.Form):username = forms.CharField(min_length=6,label="用户名",initial="hewm"  # 设置默认值方法
    )pwd = forms.CharField(min_length=6, label="密码")

error_messages

重写错误信息。

class LoginForm(forms.Form):username = forms.CharField(min_length=6,label="用户名",initial="hewm",# 重写错误提示信息error_messages={"required": "不能为空","invalid": "格式错误","min_length": "用户名最短6位"})pwd = forms.CharField(min_length=6, label="密码")

password

class LoginForm(forms.Form):...pwd = forms.CharField(min_length=6,label="密码",
# 密文方法 参数
attrs:样式类 render_value=验证失败是否回填
widget=forms.widgets.PasswordInput(attrs={'class': 'c1'}, render_value=True) )

radioSelect

单radio值为字符串

class LoginForm(forms.Form):username = forms.CharField(min_length=8,label="用户名",initial="hewm",error_messages={"required": "不能为空","invalid": "格式错误","min_length": "用户名最短8位"})pwd = forms.CharField(min_length=6, label="密码")gender = forms.fields.ChoiceField(choices=((1, ""), (2, ""), (3, "保密")),label="性别",initial=3,widget=forms.widgets.RadioSelect)

单选Select

class LoginForm(forms.Form):...hobby = forms.fields.ChoiceField(choices=((1, "篮球"), (2, "足球"), (3, "乒乓球"), ),label="爱好",initial=3,widget=forms.widgets.Select)

多选Select

class LoginForm(forms.Form):...hobby = forms.fields.MultipleChoiceField(choices=((1, "篮球"), (2, "足球"), (3, "双色球"), ),label="爱好",initial=[1, 3],widget=forms.widgets.SelectMultiple)

单选checkbox

class LoginForm(forms.Form):...keep = forms.fields.ChoiceField(label="是否记住密码",initial="checked",widget=forms.widgets.CheckboxInput)

多选checkbox

class LoginForm(forms.Form):...hobby = forms.fields.MultipleChoiceField(choices=((1, "篮球"), (2, "足球"), (3, "双色球"),),label="爱好",initial=[1, 3],widget=forms.widgets.CheckboxSelectMultiple)

关于choice的注意事项:

在使用选择标签时,需要注意choices的选项可以从数据库中获取,但是由于是静态字段 ***获取的值无法实时更新***,那么需要自定义构造方法从而达到此目的。

方式一:

from django.forms import Form
from django.forms import widgets
from django.forms import fieldsclass MyForm(Form):user = fields.ChoiceField(# choices=((1, '上海'), (2, '北京'),),initial=2,widget=widgets.Select)# 初始化init方法 (执行时间为类实例化时执行)def __init__(self, *args, **kwargs):super(MyForm,self).__init__(*args, **kwargs)# self.fields['user'].widget.choices = ((1, '上海'), (2, '北京'),)#self.fields['user'].widget.choices = models.Classes.objects.all().values_list('id','caption')

方法二

from django import forms
from django.forms import fields
from django.forms import models as form_modelclass FInfo(forms.Form):authors = form_model.ModelMultipleChoiceField(queryset=models.NNewType.objects.all())# authors = form_model.ModelChoiceField(queryset=models.NNewType.objects.all())
Fieldrequired=True,               是否允许为空widget=None,                 HTML插件label=None,                  用于生成Label标签或显示内容initial=None,                初始值help_text='',                帮助信息(在标签旁边显示)error_messages=None,         错误信息 {'required': '不能为空', 'invalid': '格式错误'}show_hidden_initial=False,   是否在当前插件后面再加一个隐藏的且具有默认值的插件(可用于检验两次输入是否一直)validators=[],               自定义验证规则localize=False,              是否支持本地化disabled=False,              是否可以编辑label_suffix=None            Label内容后缀CharField(Field)max_length=None,             最大长度min_length=None,             最小长度strip=True                   是否移除用户输入空白IntegerField(Field)max_value=None,              最大值min_value=None,              最小值FloatField(IntegerField)...DecimalField(IntegerField)max_value=None,              最大值min_value=None,              最小值max_digits=None,             总长度decimal_places=None,         小数位长度BaseTemporalField(Field)input_formats=None          时间格式化   DateField(BaseTemporalField)    格式:2015-09-01
TimeField(BaseTemporalField)    格式:11:12
DateTimeField(BaseTemporalField)格式:2015-09-01 11:12DurationField(Field)            时间间隔:%d %H:%M:%S.%f...RegexField(CharField)regex,                      自定制正则表达式max_length=None,            最大长度min_length=None,            最小长度error_message=None,         忽略,错误信息使用 error_messages={'invalid': '...'}EmailField(CharField)      ...FileField(Field)allow_empty_file=False     是否允许空文件ImageField(FileField)      ...注:需要PIL模块,pip3 install Pillow以上两个字典使用时,需要注意两点:- form表单中 enctype="multipart/form-data"- view函数中 obj = MyForm(request.POST, request.FILES)URLField(Field)...BooleanField(Field)  ...NullBooleanField(BooleanField)...ChoiceField(Field)...choices=(),                选项,如:choices = ((0,'上海'),(1,'北京'),)required=True,             是否必填widget=None,               插件,默认select插件label=None,                Label内容initial=None,              初始值help_text='',              帮助提示ModelChoiceField(ChoiceField)...                        django.forms.models.ModelChoiceFieldqueryset,                  # 查询数据库中的数据empty_label="---------",   # 默认空显示内容to_field_name=None,        # HTML中value的值对应的字段limit_choices_to=None      # ModelForm中对queryset二次筛选
     
ModelMultipleChoiceField(ModelChoiceField)...                        django.forms.models.ModelMultipleChoiceFieldTypedChoiceField(ChoiceField)coerce = lambda val: val   对选中的值进行一次转换empty_value= ''            空值的默认值MultipleChoiceField(ChoiceField)...TypedMultipleChoiceField(MultipleChoiceField)coerce = lambda val: val   对选中的每一个值进行一次转换empty_value= ''            空值的默认值ComboField(Field)fields=()                  使用多个验证,如下:即验证最大长度20,又验证邮箱格式fields.ComboField(fields=[fields.CharField(max_length=20), fields.EmailField(),])MultiValueField(Field)PS: 抽象类,子类中可以实现聚合多个字典去匹配一个值,要配合MultiWidget使用SplitDateTimeField(MultiValueField)input_date_formats=None,   格式列表:['%Y--%m--%d', '%m%d/%Y', '%m/%d/%y']input_time_formats=None    格式列表:['%H:%M:%S', '%H:%M:%S.%f', '%H:%M']FilePathField(ChoiceField)     文件选项,目录下文件显示在页面中path,                      文件夹路径match=None,                正则匹配recursive=False,           递归下面的文件夹allow_files=True,          允许文件allow_folders=False,       允许文件夹required=True,widget=None,label=None,initial=None,help_text=''GenericIPAddressFieldprotocol='both',           both,ipv4,ipv6支持的IP格式unpack_ipv4=False          解析ipv4地址,如果是::ffff:192.0.2.1时候,可解析为192.0.2.1, PS:protocol必须为both才能启用SlugField(CharField)           数字,字母,下划线,减号(连字符)...UUIDField(CharField)           uuid类型Django form内置字段
内置字段

校验

方式一:

from django.forms import Form
from django.forms import widgets
from django.forms import fields
from django.core.validators import RegexValidatorclass MyForm(Form):user = fields.CharField(validators=[RegexValidator(r'^[0-9]+$', '请输入数字'), RegexValidator(r'^159[0-9]+$', '数字必须以159开头')],)

方式二:

import re
from django.forms import Form
from django.forms import widgets
from django.forms import fields
from django.core.exceptions import ValidationError# 自定义验证规则
def mobile_validate(value):mobile_re = re.compile(r'^(13[0-9]|15[012356789]|17[678]|18[0-9]|14[57])[0-9]{8}$')if not mobile_re.match(value):raise ValidationError('手机号码格式错误')class PublishForm(Form):title = fields.CharField(max_length=20,min_length=5,error_messages={'required': '标题不能为空','min_length': '标题最少为5个字符','max_length': '标题最多为20个字符'},widget=widgets.TextInput(attrs={'class': "form-control",'placeholder': '标题5-20个字符'}))# 使用自定义验证规则phone = fields.CharField(validators=[mobile_validate, ],error_messages={'required': '手机不能为空'},widget=widgets.TextInput(attrs={'class': "form-control",'placeholder': u'手机号码'}))email = fields.EmailField(required=False,error_messages={'required': u'邮箱不能为空','invalid': u'邮箱格式错误'},widget=widgets.TextInput(attrs={'class': "form-control", 'placeholder': u'邮箱'}))

补充进阶

应用Bootstrap样式

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="x-ua-compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1"><link rel="stylesheet" href="/static/bootstrap/css/bootstrap.min.css"><title>login</title>
</head>
<body>
<div class="container"><div class="row"><form action="/login2/" method="post" novalidate class="form-horizontal">{% csrf_token %}<div class="form-group"><label for="{{ form_obj.username.id_for_label }}"class="col-md-2 control-label">{{ form_obj.username.label }}</label><div class="col-md-10">{{ form_obj.username }}<span class="help-block">{{ form_obj.username.errors.0 }}</span></div></div><div class="form-group"><label for="{{ form_obj.pwd.id_for_label }}" class="col-md-2 control-label">{{ form_obj.pwd.label }}</label><div class="col-md-10">{{ form_obj.pwd }}<span class="help-block">{{ form_obj.pwd.errors.0 }}</span></div></div><div class="form-group"><label class="col-md-2 control-label">{{ form_obj.gender.label }}</label><div class="col-md-10"><div class="radio">{% for radio in form_obj.gender %}<label for="{{ radio.id_for_label }}">{{ radio.tag }}{{ radio.choice_label }}</label>{% endfor %}</div></div></div><div class="form-group"><div class="col-md-offset-2 col-md-10"><button type="submit" class="btn btn-default">注册</button></div></div></form></div>
</div><script src="/static/jquery-3.2.1.min.js"></script>
<script src="/static/bootstrap/js/bootstrap.min.js"></script>
</body>
</html>Django form应用Bootstrap样式简单示例
代码示例

批量添加样式

可通过重写form类的init方法来实现。

class LoginForm(forms.Form):username = forms.CharField(min_length=8,label="用户名",initial="张三",error_messages={"required": "不能为空","invalid": "格式错误","min_length": "用户名最短8位"}...def __init__(self, *args, **kwargs):super(LoginForm, self).__init__(*args, **kwargs)for field in iter(self.fields):self.fields[field].widget.attrs.update({'class': 'form-control'})批量添加样式
代码示例

源码简易剖析

views.py文件

def register(request):if request.method == "POST":res = {"user": None, "error_dict": None}form = RegForm(request.POST)# 存储验证通过的信息.is_valid()(源码剖析开始点)if form.is_valid():user = form.cleaned_data.get("user")pwd = form.cleaned_data.get("pwd")email = form.cleaned_data.get("email")avatar = request.FILES.get("avatar")print(user,pwd,email,avatar)print("="*120)if avatar:user = UserInfo.objects.create_user(username=user, password=pwd, email=email, avatar=avatar)else:user = UserInfo.objects.create_user(username=user, password=pwd, email=email)res["user"] = user.usernameelse:print(form.errors)res["error_dict"] = form.errorsreturn JsonResponse(res)form = RegForm()return render(request, 'register.html', locals())
views.py

点击进入forms.py文件

    def is_valid(self):"""Returns True if the form has no errors. Otherwise, False. If errors arebeing ignored, returns False."""# 含义:返回布尔值,只要有数据并且没有错误信息就返回Truereturn self.is_bound and not self.errors
forms.py

点击self.errors进入forms.py文件中

# 静态方法
@propertydef errors(self):"Returns an ErrorDict for the data provided for the form"# 判断self._errors是否为空if self._errors is None:self.full_clean()return self._errors
def errors(self):

点击._errors进入forms.py文件中

    def __init__(self, data=None, files=None, auto_id='id_%s', prefix=None,initial=None, error_class=ErrorList, label_suffix=None,empty_permitted=False, field_order=None, use_required_attribute=None, renderer=None):self.is_bound = data is not None or files is not Noneself.data = data or {}self.files = files or {}self.auto_id = auto_idif prefix is not None:self.prefix = prefixself.initial = initial or {}self.error_class = error_class# Translators: This is the default suffix added to form field labelsself.label_suffix = label_suffix if label_suffix is not None else _(':')self.empty_permitted = empty_permitted# 默认值为Noneself._errors = None  # Stores the errors after clean() has been called.# The base_fields class attribute is the *class-wide* definition of# fields. Because a particular *instance* of the class might want to# alter self.fields, we create self.fields here by copying base_fields.# Instances should always modify self.fields; they should not modify# self.base_fields.self.fields = copy.deepcopy(self.base_fields)self._bound_fields_cache = {}self.order_fields(self.field_order if field_order is None else field_order)
__init__方法

返回def errors(self):

    @propertydef errors(self):"Returns an ErrorDict for the data provided for the form"if self._errors is None:self.full_clean()  # 这个方法才是真正帮忙执行效验操作return self._errors
返回errors方法

点击

    def full_clean(self):"""Cleans all of self.data and populates self._errors andself.cleaned_data."""self._errors = ErrorDict()  # 定义一个保存错误信息字典if not self.is_bound:  # Stop further processing.returnself.cleaned_data = {}# If the form is permitted to be empty, and none of the form data has# changed from the initial data, short circuit any validation.if self.empty_permitted and not self.has_changed():returnself._clean_fields()self._clean_form()self._post_clean()
full_clean方法

点击self._clean_fields()进入

    def _clean_fields(self):for name, field in self.fields.items():# self.fields:类似一个字典#for name, field in self.fields.items():解释分别获取self.fields的键和值分别赋值给 name, field# value_from_datadict() gets the data from the data dictionaries.# Each widget type knows how to retrieve its own data, because some# widgets split data over several HTML fields.if field.disabled:value = self.get_initial_for_field(field, name)else:value = field.widget.value_from_datadict(self.data, self.files, self.add_prefix(name))try:if isinstance(field, FileField):  # 如果是文件字段initial = self.get_initial_for_field(field, name)value = field.clean(value, initial)else:  #   field.clean(value) 之后Dbug运行检查,为循环判断错误value = field.clean(value)self.cleaned_data[name] = valueif hasattr(self, 'clean_%s' % name):value = getattr(self, 'clean_%s' % name)()self.cleaned_data[name] = valueexcept ValidationError as e:self.add_error(name, e)
def _clean_fields(self):方法

06后期追加

 

转载于:https://www.cnblogs.com/L5251/articles/8792927.html

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

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

相关文章

mysql上k8s_通过搭建MySQL掌握k8s(Kubernetes)重要概念(上):网络与持久卷

上一篇"通过实例快速掌握k8s(Kubernetes)核心概念"讲解了k8s的核心概念&#xff0c;有了核心概念整个骨架就完整了&#xff0c;应付无状态程序已经够了&#xff0c;但还不够丰满。应用程序分成两种&#xff0c;无状态和有状态的。一般的前段和后端程序都是无状态的&a…

python简单笔记

Remarks&#xff1a;python中注意缩进&#xff08;Tab键或者4个空格&#xff09; print&#xff08;输出&#xff09; 格式&#xff1a;print&#xff08;values&#xff09; 字符串、数字、变量等都可以输出&#xff1a; 实例&#xff1a; print(1)->1 print(11)->2 a …

mysql字符集latin1_mysql的latin1字符集支持所有字符集

1. 先来看看latin1 (参考百度百科)Latin1是ISO-8859-1的别名&#xff0c;有些环境下写作Latin-1。ISO-8859-1编码是单字节编码&#xff0c;向下兼容ASCII&#xff0c;其编码范围是0x00-0xFF&#xff0c;0x00-0x7F之间完全和ASCII一致&#xff0c;0x80-0x9F之间是控制字符&#…

latex参考文献bib基本格式_在Latex中利用.bib进行参考文献管理

使用bibtex与jabref简化论文写作中的文献管理和引用bibtex是latex(中文Ctex可在www.ctex.org找到)的一个组件&#xff0c;用于文献引用。.bib是文献引用信息文件。1. IEEEtran包(Package)的下载打开WinEdt。选择Accessories->MiKTex->MiKTex Package Manager&#xff0c;…

BZOJ2302 [HAOI2011]Problem c 【dp】

题目 给n个人安排座位&#xff0c;先给每个人一个1~n的编号&#xff0c;设第i个人的编号为ai&#xff08;不同人的编号可以相同&#xff09;&#xff0c;接着从第一个人开始&#xff0c;大家依次入座&#xff0c;第i个人来了以后尝试坐到ai&#xff0c;如果ai被占据了&#xff…

mysql 3_mysql3

回顾字段类型(列类型): 数值型, 时间日期型和字符串类型数值型: 整型和小数型(浮点型和定点型)时间日期型: datetime, date,time,timestamp, year字符串类型: 定长, 变长, 文件字符串(text和blob), 枚举和集合Mysql记录长度: 65535个字节, varchar达不到理论长度, NULL占用一个…

H5+App开发框架汇总

MUI&#xff1a;http://dcloudio.github.io/mui/&#xff08;使用H5app模式&#xff0c;号称是最接近原生&#xff0c;但是目前在手机和电脑浏览器无法使用&#xff09; app-framework&#xff1a;http://app-framework-software.intel.com/ &#xff08;有Android、iOS等主题样…

C#-interface

接口成员不能有访问修饰符&#xff0c;默认为public。接口成员只能给出签名&#xff0c;不能有具体实现。继承接口的类必须全部实现接口成员。接口是多继承的。实现继承的过程中&#xff0c;基类必须放在所有接口的最前面。接口不能实例化对象。接口是引用类型。转载于:https:/…

【Alpha阶段】第一次Scrum Meeting

PS&#xff1a;因为安装android的SDK插件出现问题&#xff0c;在eclipse和android studio中安装都不成功&#xff0c;项目不能运行&#xff0c;且一直在下载一些插件&#xff0c;安装了3天都没有成功&#xff0c;按照网上的解决办法进行解决都没有成功&#xff0c;导致项目不能…

mysql galera 下载_Mysql-Galera Cluster

使用Galera Cluster需要下载包含wsrep补丁的mysql版本&#xff1b;官网下载地址&#xff1a;http://galeracluster.com/downloads/安装前要卸载之前安装的mariadb或者mysql&#xff1b;或者迁移也可以&#xff0c;不过就是另一套操作了&#xff01;具体的安装过程官网描述的很完…

ext4fs error mysql_请教一个 Linux 挂在磁盘阵列报错 EXT4-fs error 问题

从昨天开始 linux 通过光纤直接连接磁盘阵列&#xff0c;会出现磁盘阵列掉了的情况&#xff0c;然后机器会重启&#xff0c;本来重启后&#xff0c;rose ha 会自动挂载磁盘阵列&#xff0c;现在由于 rose ha 也出了点问题&#xff0c;导致不切换备用服务器&#xff0c;主服务器…

hashtable和hashmap的区别?

相同点&#xff1a; 1.都实现了map接口 2.都是键值对的方式存储 3.都是通过单链表解决冲突的 4. 都实现了Serializable接口和Cloneable接口&#xff0c;因此它支持序列化和被克隆。 不同点&#xff1a; 1.hashtable不支持键-值为null,而hashmap支持。 2.hashmap是线程不安全&am…

mysql数据库的各种锁_关于MySQL各类锁的总结

想要用好 MySQL&#xff0c;索引与锁是一个绕不开的话题。最近一直在维护以前的业务系统&#xff0c;线上频繁报出数据库死锁的异常警告&#xff0c;为了排查以及规避死锁的问题&#xff0c;因此对 MySQL 的锁(Innodb引擎)做了一个比较深入学习&#xff0c;顺便加深自己对 MySQ…

581. Shortest Unsorted Continuous Subarray连续数组中的递增异常情况

&#xff3b;抄题&#xff3d;&#xff1a; Given an integer array, you need to find one continuous subarray that if you only sort this subarray in ascending order, then the whole array will be sorted in ascending order, too. You need to find the shortest suc…

python enumerate函数返回值_python中enumerate函数用法实例分析

本文实例讲述了python中enumerate函数用法。分享给大家供大家参考。具体分析如下&#xff1a;今日发现一个新函数 enumerate 。一般情况下对一个列表或数组既要遍历索引又要遍历元素时&#xff0c;会这样写&#xff1a; for i in range (0,len(list)):print i ,list[i]但是这种…

Java异常处理原则与技巧总结

一 处理原则 Java异常代码中我们使用异常的目的是让异常的异常类型来提示“什么”被抛出了--- 即出了什么问题&#xff1b;用异常的栈打印信息来跟踪异常在“哪里”抛出 --- 即哪里出了问题&#xff1b; 异常提示信息来提示“为什么”会抛出 --- 即出问题的原因。在对异常进行…

python三阶魔方_三阶魔方自动求解及动态可视化matlab代码

三阶魔方自动求解及动态可视化matlab代码思路与步骤三阶魔方有6个面&#xff0c;每个面有333\times333小块&#xff0c;用一个6336\times3\times3633的矩阵来保存魔方的状态&#xff1b;定义412种魔方旋转行为&#xff1a;整体旋转(左右上下共4种方式AaCc)&#xff0c;侧面(6个…

Qt 常用类——QStandardItemModel

转载&#xff1a;落叶知秋时 类QabstractItemModel&#xff0c;QabstractListModel&#xff0c;QAbstractTableModel不保存数据&#xff0c;用户需要从这些类派生出子类&#xff0c;并在子类中定义某种数据结构来保存数据。 与此不同&#xff0c;类QStandardItemModel负责保存数…

thinkphp mysql 中文_耗时5天解决thinkphp连接mysql中文乱码的问题

坑大&#xff0c;或者不大&#xff0c;它就在那里&#xff0c;等着你进。先前修改成熟的一个基于thinkphp3.1.2的后台框架&#xff0c;里面有我的autoCode&#xff0c;本来在新项目上不想再用这么落后的版本&#xff0c;但考虑到后台项目不对外使用&#xff0c;重点是autoCode是…

bzoj3203: [Sdoi2013]保护出题人

我三分这么好吗居然1A啦&#xff1f;&#xff1f;&#xff1f;提交的时候只是想着先WA一次的。。。。 这题真的很妙啊 首先第一步&#xff0c;就是把僵尸的生命值取一个前缀和&#xff0c;这样造成伤害的时候&#xff0c;可以视为同时对所有僵尸造成伤害。 那么就可以得到一个柿…