前言
学无止境,无止境学。大家好,我是张大鹏,之前在抖音有5万多粉丝,不过现在不拍视频,专心写公众号了。笔者目前是高级Python工程师,之前是全栈工程师,主要擅长Golang和Python开发,对于Java,Vue,React也有一些研究。工作之余,喜欢学习和分享,希望能够通过此公众号”张大鹏520″,将自己学到的东西分享给大家,和大家一起交流,一起成长,一起进步。
今天要给大家分享的是《Django加Vue电商项目实战10 模型表单实现用户注册实战》,这是一个系列的教程,从零基础到项目实战。在本教程中,我会给大家介绍Django使用模型表单实现用户注册的一个实战案例。主要包括模型表单的创建,使用,校验等。还会配套相关的练习,大家学完以后可以自行通过练习题巩固和加深对知识点的理解。
如果大家需要本教程的PDF电子书或者完整的源码,可以在文末找到获取方式哈。
模型表单实现用户注册实战
模型设计
设计模型:
from django.db import models
class UserBaseInfo(models.Model):
"""用户基本信息"""
id = models.AutoField(verbose_name='编号', primary_key=True)
username = models.CharField(verbose_name='用户名称', max_length=30)
password = models.CharField(verbose_name='密码', max_length=10)
age = models.IntegerField(verbose_name="年龄", default=1)
mobile = models.CharField(verbose_name="手机号码", max_length=11)
status = models.CharField(verbose_name='状态', max_length=1)
createdate = models.DateTimeField(verbose_name='创建日期', db_column='create_date', auto_now=True)
def __str__(self):
return f"UserBaseInfo(id={self.id},username={self.username},age={self.age},mobile={self.mobile},status={self.status})"
def __repr__(self):
return self.__str__()
class Meta:
managed = True
verbose_name = '人员基本信息'
db_table = 'user'
迁移模型:
python manage.py makemigrations
python manage.py migrate
添加用户数据的脚本
import os
import sys
# 设置目录查找路径
sys.path.insert(0, '../../')
# 设置Django配置信息
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'z06_django_form.settings')
import django
from django.utils import timezone
django.setup()
# 导入模型
from index.models import UserBaseInfo
import zdppy_random
if __name__ == "__main__":
# 先清空数据
UserBaseInfo.objects.all().delete()
# 准备数据
user_dict = {
"username": zdppy_random.random_ename(),
"password": zdppy_random.random_str(10),
"age": zdppy_random.random_int(20, 40),
"mobile": zdppy_random.random_phone(),
"status": str(zdppy_random.random_int(0, 2)),
"createdate": timezone.now(),
}
# 执行创建
UserBaseInfo.objects.create(**user_dict)
# 查询结果
all = UserBaseInfo.objects.all().values()
print(all)
路由设计
from django.urls import path
from . import views
app_name = 'index'
urlpatterns = [
# 模型表单数据校验
path('validate_model/', views.validate_model, name='validate_model'),
]
表单设计
import re
from django import forms
from django.core.exceptions import ValidationError
from .models import UserBaseInfo
class UserBaseInfoModelForm(forms.ModelForm):
"""用户基本信息模型表单"""
# 确认密码,模型中没有的字段
confirm_password = forms.CharField(
label='确认密码', widget=forms.PasswordInput(render_value=True),
error_messages={
'required': '密码不能为空',
})
class Meta:
# 定义关联模型
model = UserBaseInfo
# 定义需要在表单中展示的字段。
fields = ['username', 'password',
'confirm_password', 'age', 'mobile', 'status']
# 如果要显示全部字段,可以如下设置
# fields="__all__"
# 如果Models中定义了名称,这里不用再定义
labels = {
"age": "最佳年龄",
"mobile": "手机信息",
}
# 表单自定义
widgets = {
# 文本框渲染为密码输入框
"password": forms.widgets.PasswordInput(attrs={"class": "password"}, render_value=True),
"confirm_password": forms.widgets.PasswordInput(attrs={"class": "password"}, render_value=True)
}
# 错误信息
error_messages = {
"username": {
'required': '用户姓名不能为空',
'min_length': '长度最少6位',
'invalid': '输入正确的用户姓名'
},
"password": {
'max_length': '密码最长10位',
'required': '密码不能为空',
'min_length': '密码最少6位'
},
"age": {
'required': '年龄不能为空',
},
"mobile": {
'required': '手机号码不能为空',
},
"status": {
'required': '用户状态不能为空',
}
}
# 校验手机号码的局部钩子函数
def clean_mobile(self):
"""校验手机号"""
mobile = self.cleaned_data.get('mobile')
print(mobile)
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(mobile):
raise ValidationError('手机号码格式错误')
return mobile
# 全局钩子函数
def clean(self):
"""校验密码"""
password = self.cleaned_data.get("password")
confirm_password = self.cleaned_data.get("confirm_password")
if password != confirm_password:
raise forms.ValidationError("二次密码输入不一致")
视图函数
import os
from django.http import HttpResponse
from django.shortcuts import render
from .forms import UserInfoForm, UserInfoValidateForm, ImgFileForm, UserBaseInfoModelForm
from .models import ImgFile, UserBaseInfo
def validate_model(request):
"""模型表单校验"""
if request.method == "GET":
# 渲染页面
a = UserBaseInfo.objects.get(id=1)
myform = UserBaseInfoModelForm(instance=a)
return render(request, "validate_model.html", {'form_obj': myform})
else:
# 获取表单数据并校验
f = UserBaseInfoModelForm(request.POST)
if f.is_valid():
# 模型表单可以直接调用保存方法
f.save()
else:
errors = f.errors
print(errors)
return render(request, "validate_model.html", {'form_obj': f, 'errors': errors})
return render(request, "validate_model.html", {'form_obj': f})
模板
<form action="{% url 'index:validate_model' %}" method="POST" novalidate>
{% csrf_token %}
<p>{{ form_obj.username.label }}:{{ form_obj.username }}
{{ errors.username.0 }}
</p>
<p>{{ form_obj.password.label }}:{{ form_obj.password }}
{{ form_obj.errors.password.0 }}
</p>
<p>{{ form_obj.confirm_password.label }}:{{ form_obj.confirm_password }}
{{ form_obj.errors.confirm_password.0 }}
</p>
<p>{{ form_obj.status.label }}:{{ form_obj.status }}
{{ errors.status.0 }}
</p>
<p>{{ form_obj.age.label }}:{{ form_obj.age }}
{{ errors.age.0 }}
</p>
<p>{{ form_obj.mobile.label }}:{{ form_obj.mobile }}
{{ errors.mobile.0 }}
</p>
错误信息汇总在一起显示:
{{ errors }}
<input type="submit" value="提交">
</form>
测试
测试地址:http://192.168.33.13:8000/validate_model/
结语
关注我不迷路,欢迎关注我的微信公众号”张大鹏520″,如果您对此文章感兴趣,欢迎点赞收藏,留言评论。
文中所有代码,只需要打赏20元,然后留言评论“已打赏”,即可获取哦。
本文的PDF电子书版,只需要打赏3元,然后留言评论“已打赏”,即可获取哦。
写文章不容易,不喜勿喷哈,如果有想要学编程,学项目,或者在工作中有项目难以单独完成需要提供帮助的同学,欢迎私信我哈。生活不易,想要利用学到的编程知识,业余赚点零花钱。
接项目:网站开发,APP开发,各种管理系统开发。
带徒弟:Python编程教学,Golang编程教学,前端编程教学。
谢谢您!!!
原文始发于微信公众号(张大鹏520):Django加Vue电商项目实战10 模型表单实现用户注册实战
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/48600.html