自己在html页面写form表单,
提交到后端
判断数据,反馈信息,都是自己完成,但是返回时用户填写的内容已经清空,如:
不用Django中form表单模块.html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/register/" method="post">
{% csrf_token %}
<input type="text" name="username">用户名
<p style="color:purple">{{ error_msg }}</p>
<input type="password" name="pwd">密码
<input type="submit">提交
</form>
</body>
</html>
url
from django.conf.urls import url
from django.contrib import admin
from app01 import views
urlpatterns = [
url(r'^register1/', views.register1),
url(r'^login/', views.login)
]
from django.shortcuts import render, redirect
from django import forms
from app01.models import User
# Create your views here.
# 注册
def register1(request):
if request.method == 'POST':
username = request.POST.get('username')
if len(username) < 3 or len(username) > 12:
return render(request, '不用Django中form表单模块.html', {'error_msg': '用户名长度最小3位,最大12位'})
pwd = request.POST.get('pwd')
User.objects.create(name=username, pwd=pwd)
return redirect('/login/')
return render(request, '不用Django中form表单模块.html')
运行结果
使用Django中的Form模块
- 作用
- 不用自己写form表单的HTML页面
- 对用户输入做验证
- 展示错误提示信息并且保存用户原来填写的内容。
html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/registerd/" method="post" novalidate>
{% csrf_token %}
{{ form.errors }}
{{ form.as_p }}
<input type="submit">
</form>
</body>
</html>
urls
from django.conf.urls import url
from django.contrib import admin
from app01 import views
urlpatterns = [
url(r'^register1/', views.register1),
url(r'^login/', views.login),
url(r'^registerd/', views.registerd)
]
views
from django.shortcuts import render, redirect
from django import forms
from app01.models import User
# Create your views here.
from django import forms
# 新建一个继承forms.Form的类
class RegForm(forms.Form):
name = forms.CharField(max_length=12, min_length=3)
password = forms.CharField(min_length=6)
# 使用django中的form表单方式
def registerd(request):
if request.method == 'POST':
form_obj = RegForm(request.POST)
if form_obj.is_valid(): # is_valid判断是否有效,如果有效就创建对象。Returns True if the form has no errors. Otherwise, False. If errors are being ignored, returns False.
User.objects.create(form_obj.cleaned_data) # 干净的数据,把数据拿过来创建对象
return redirect('/login/')
else:
print(form_obj.errors)
return render(request, '使用django中的form表单.html', {'form': form_obj})
form_obj = RegForm()
return render(request, '使用django中的form表单.html', {'form': form_obj})
过程图
form.as_p翻译后的html内容
form.errors翻译后的内容
还可以自己写标签
html文件
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/registerd/" method="post" novalidate>
{% csrf_token %}
{{ form.errors }}
<hr>
<div>
<label for="{{ form.name.id_for_label }}">{{ form.name.label }}</label>
{{ form.name }}
</div>
<div>
<label for="{{ form.password.id_for_label }}">{{ form.password.label }}</label>
{{ form.password }}
</div>
<hr>
{% for field in form %}
<div>
<label for="{{ field.id_for_label }}">{{ field.label }}</label>
{{ field }}
{{ field.errors.0 }}
</div>
{% endfor %}
<input type="submit">
</form>
</body>
</html>
views文件
from django.shortcuts import render, redirect
from django import forms
from app01.models import User
# Create your views here.
from django import forms
# 新建一个继承forms.Form的类
class RegForm(forms.Form):
name = forms.CharField(max_length=12, min_length=3, label='用户名')
password = forms.CharField(min_length=6, label='密码')
re_password = forms.CharField(min_length=6, label='确认密码')
# 使用django中的form表单方式
def registerd(request):
if request.method == 'POST':
form_obj = RegForm(request.POST)
if form_obj.is_valid(): # is_valid判断是否有效,如果有效就创建对象。Returns True if the form has no errors. Otherwise, False. If errors are being ignored, returns False.
User.objects.create(form_obj.cleaned_data) # 干净的数据,把数据拿过来创建对象
return redirect('/login/')
else:
print(form_obj.errors)
return render(request, '使用django中的form表单.html', {'form': form_obj})
form_obj = RegForm()
return render(request, '使用django中的form表单.html', {'form': form_obj})
结果
内部过程
field.errors
把颜色改成红色
django中设置中文提示
默认字段提示是True,如果该为False就没有提示了
form常用字段和插件
- inital初始化
-
error_messages
-
widgets
-
给表单加上bootstrap样式
html
views
页面显示结果
-
render_value
一般网站不会设置记住密码,因为如果密码输入不一致可能会忘记前次输入的密码,如果想要浏览器记住密码,设置render_value=True
-
单选的radio
-
多选的select标签
- 单选的select
- 由于爱好这栏修改比较多,所以存在数据库中,在数据库中取到元组,这样就不用每次在类中修改数据了,只需在数据库中做修改
数据库中数据:
在form类中使用数据库的值
页面显示结果
由于form表单第一次实例化时是懒加载的,就是每次动态获取字段的查询一次后,以后都用这次的,需强制更新。
方式一:
在from表单实例化时重写父类的__init__方法,手动查询需要的字段,由于每次实例化时也就是页面刷新时都会执行这个方法。
方式二:导入django中from模块的models,和模型系统的model搭配使用
from校验规则
djangoforms中的ModelForm
继承ModelFormMetaclass类和BaseModelForm类,BaseModelForm继承BaseForm类,而Form也是继承BaseForm类,所以,功能都是在html页面生成form表单,只是ModelForm和ORM中的模型联系起来了。可以更加便捷处理模型中的数据。
- 显示表单数据
例,表中的一个对象放到类中的参数instance后,就能像使用其中的model中的字段或字段的参数。
对表中的数据进行修改
方法一
方法二
还有一种更简洁的方法
- 修改数据