(五)表单类的创建和使用
2019-11-23 10:34 那个杰克 阅读(487) 评论(0) 编辑 收藏 举报一、创建表单
表单类的作用:
1、在template模板中,使用Django中已存在的表单,快速生成表单控件,该类表单控件已存在验证数据合法性的功能,开箱即用。
2、在view视图函数中,使用表单类对Model模型对应的数据库表进行数据的存储作用
表单类组件的类型:
1、Form组件:
- 生成页面可用的HTML标签
- 对用户提交的数据进行校验
- 保留上次输入的内容
- 表单仅提供数据的读取使用
- 可验证
2、ModelForm组件:(Model和Form的结合)
- 可验证,用户可对表单控件数据校验
- 对数据库进行操作
创建前需要在应用目录下新增from.py文件,文件用来存放该应用下需要创建的表单类
二、 表单类的使用
#登录的表单类(不会对数据操作)
class LoginForm(forms.Form):
username = forms.CharField()
password = forms.CharField(widget=forms.PasswordInput)
#注册的表单类(会对数据库操作)
class RegistrationForm(forms.ModelForm):
# password 和 password2新增的表单控件
password = forms.CharField(label="密码",widget=forms.PasswordInput)
password2 = forms.CharField(label="确认密码",widget=forms.PasswordInput)
class Meta:
model=User #表示表单类操作User模型
fields=("username","email") #列出username、email字段,表单控件包含这两项
# 验证
def clean_password2(self):
cd = self.cleaned_data
if cd["password"] != cd["password2"]:
raise forms.ValidationError("请再次确认密码")
return cd["password2"]
三、表单类在视图函数中的使用
1、Form组件的控件使用
使用在GET方法中,用于渲染出表单控件
def user_login(request):
if request.method == "GET":
login_form = LoginForm()
return render(request,"account/login.html",{"form":login_form})
使用在POST方法中,用于验证
login_form = LoginForm(request.POST)# request.POST获取用户填写的值
if login_form.is_valid():
user = authenticate(login_form.cleaned_data)
if user:
login(request,user)
return HttpResponse("您已经登录成功....")
else:
return HttpResponse("您的用户名或密码错误,请重新登录")
else:
login_url = reverse("account:user_login")
return redirect(login_url)
2、ModelForm组件的控件使用
使用在GET方法中,用于渲染出表单控件
def user_Registration(request):
if request.method == "GET":
registration_form = RegistrationForm()
return render(request,"account/register.html",{"form":user_form,"profile":phone_form})
使用在POST方法中,用于对model模型对应的数据库表操作
elif request.method == "POST":
user_form = RegistrationForm(request.POST)
userprofile_form = UserProfileForm(request.POST)
if user_form.is_valid() and userprofile_form.is_valid():
new_user = user_form.save(commit=False)
new_user.set_password(user_form.cleaned_data['password2'])
new_user.save()
new_profile = userprofile_form.save(commit=False)
new_profile.user = new_user #这里保存对应user_id的外键
new_profile.save()
print("new_user",new_user)
#新增UserInfo关联的用户
UserInfo.objects.create(user=new_user)
login_url = reverse("account:user_login")
return redirect(login_url)
else:
return HttpResponse("注册失败")
四、表单类在模板中的使用
1、登录模板控件
account/login.html
{% block content %}
<div class="container">
<h1 class="mb-3 bd-text-purple-bright">登录</h1>
<form class="js-validate" action="." method="post">
{% csrf_token %}
<div class="spadding">
<label for="{{ form.username.id_for_label }}" class="title">用户名:</label>
{{ form.username }}
</div>
<div class="spadding">
<label for="{{ form.password.id_for_label }}" class="title">密码:</label>
{{ form.password }}
</div>
<input type="submit" class="btn btn-block btn-primary" value="登录">
</form>
</div>
{% endblock %}
2、注册模板控件
account/register.html
{% block content %}
<div class="container">
<h1>注册</h1>
<form class="form-horizontal" action="{% url 'account:register' %}" method="post">
{% csrf_token %}
<div class="form-group">
<label for="{{ form.username.id_for_label }}" class="">用户名</label>
<div id="{{ form.username.id_for_label }}" class="">{{ form.username }}</div>
<label for="{{ form.email.id_for_label }}" class="">邮箱</label>
<div id="{{ form.email.id_for_label }}" class="">{{ form.email }}</div>
<label for="{{ form.password.id_for_label }}" class="">密码</label>
<div id="{{ form.password.id_for_label }}" class="">{{ form.password }}</div>
<label for="{{ form.password2.id_for_label }}" class="">确认密码</label>
<div id="{{ form.password2.id_for_label }}" class="">{{ form.password2 }}</div>
</div>
<input type="submit" class="btn btn-primary btn-lg" value="注册">
</form>
</div>
{% endblock %}
注册表单控件效果图:
五、表单类与数据库
表单类对数据库的操作有两种:
1、表单类无新增字段,操作数据库,对表单类绑定的数据,保存到数据库
elif request.method == "POST":
img = request.POST.get("img","")
if img:
userinfo = UserInfo.objects.get(user=request.user.id)
userinfo.photo = img
userinfo.save()
return HttpResponse("1")
else:
print("上传文件,没有获取到任何内容~")
2、表单类需新增字段,操作数据库,对表单类绑定的数据和新增的字段,保存到数据库
user_form = RegistrationForm(request.POST)
userprofile_form = UserProfileForm(request.POST)
if user_form.is_valid() and userprofile_form.is_valid():
new_user = user_form.save(commit=False) #不立即保存到数据库,需要新增表单类中未绑定的字段
new_user.set_password(user_form.cleaned_data['password2'])
new_user.save()
new_profile = userprofile_form.save(commit=False)
new_profile.user = new_user #这里保存对应user_id的外键
new_profile.save()
print("new_user",new_user)
#新增UserInfo关联的用户
UserInfo.objects.create(user=new_user)
login_url = reverse("account:user_login")
return redirect(login_url)
六、自定义表单类
待写....
总结:
Django中自带的表单类,可以快速完成平常日常的控件开发工作,简化了开发功能,就像轮子一样,你可以学会直接用,你也可以去自己造。