Form表单 之ModelForm
ModelForm继承了Model和Form的双重功能,既可以处理Form内容,又可以处理Model数据库(是不是非常好用)。
1、实现form表单数据直接创建于更新;
2、实现Model字段合规性检测;
3、实现input代码生成,传递到HTML自动生成input标签;
4、自定义Model字段,例如实现正则检测。
forms.py配置
class UserForm(forms.ModelForm):
username = fields.CharField(
required=True,
max_length=10,
min_length=5,
error_messages={"required": "用户名不能为空"},
widget=widgets.TextInput(attrs={
"class": "form-control",
"id": "reg-username",
"placeholder": "Username"
})
)
password = fields.CharField(
required=True,
max_length=10,
min_length=5,
error_messages={"required": "密码不能为空"},
widget=widgets.PasswordInput(attrs={
"class": "form-control",
"id": "reg-password",
"placeholder": "password"
})
)
email = fields.CharField(
required=True,
max_length=10,
error_messages={"required": "邮箱不能为空", "invalid": "邮箱格式错误"},
widget=widgets.EmailInput(attrs={
"class": "form-control",
"id": "reg-email",
"placeholder": "email"
})
)
class Meta:
model = UserInfo
fields = ["username", "password", "email"] # 或者 “__all__”
def clean_password(self):
"""
密码复杂度检测,密码必须包含大小写字母、数字、特称字符,至少8位,最多30位。
"""
password = self.cleaned_data["password"]
regex_password = "(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[^a-zA-Z0-9]).{8,30}"
p = re.compile(regex_password)
if p.match(password):
return password
else:
raise forms.ValidationError("密码复杂度不符合要求,密码必须包含大小写字母、数字、特称字符,至少8位,最多30位。", code="password_invalid")
views.py配置
class RegisterView(View): """ 注册视图 """ def get(self, request): register_obj = UserForm() return render(request, "register.html", locals()) def post(self, request): register_obj = UserForm(request.POST) if register_obj.is_valid(): register_obj.save(commit=True) return render(request, "register_success.html") else: return render(request, "register.html", {"register_obj": register_obj})
HTML配置
<form class="form-horizontal reg-form" action="{% url "register" %}" method="post" novalidate> <span class="heading reg-ok">User Register</span> <div class="form-group reg-remove"> {{ register_obj.username }} <i class="fa fa-user"></i> <p id="reg-p-u">{{ register_obj.errors.username }}</p> <i id="reg-i-u" style="display: none">0</i> </div> <div class="form-group help reg-remove"> {{ register_obj.password }} <i class="fa fa-lock"></i> </div> <div class="form-group help reg-remove"> <input type="password" class="form-control" id="reg-password2" placeholder="Repeat Password"> <i class="fa fa-lock"></i> <p id="reg-p-p">{{ register_obj.errors.password }}</p> <i id="reg-i-p" style="display: none">0</i> </div> <div class="form-group reg-remove"> {{ register_obj.email }} <i class="fa fa-envelope-o"></i> <p id="reg-p-e">{{ register_obj.errors.email }}</p> </div> <div class="form-group reg-remove"> <span class="text" id="login" style="cursor: pointer; font-size: 15px"><a href="{% url "login" %}">注册成功? 立即登录</a></span> <input id="reg-submit" type="submit" class="btn btn-default" value="Register"> </div> {% csrf_token %} </form>
Form.Instance(直接对User表进行更新)
示例:对User image进行更新
image_form = UploadImageForm(request.POST, request.FILES, instance=request.user)
if image_form.is_valid():
image_form.save()