普通Form表单的提交
<!-- name:index.html --> | |
<html lang="en"> | |
<head> | |
<meta charset="UTF-8"> | |
<title>Title</title> | |
</head> | |
<body> | |
<form action="/" method="post"> | |
<p>账号:<input type="text" name="username"><span>{{ error.username }}</span></p> | |
<p>密码:<input type="password" name="password"><span>{{ error.password }}</span></p> | |
<input type="submit" value="提交请求"> | |
</form> | |
</body> | |
</html> | |
# name: views.py | |
from django.shortcuts import render,HttpResponse | |
def index(request): | |
if request.method == "GET": | |
return render(request,"index.html") | |
else: | |
username = request.POST.get("username") | |
password = request.POST.get("password") | |
error = {"username":"","password":""} | |
if len(username) > 10: | |
error["username"]="用户名不能大于10" | |
if len(password) < 5: | |
error["password"] = "密码不能小于5" | |
return render(request,"index.html",{"error":error}) |
Form实现登录表单
<!--name:index.html--> | |
<!DOCTYPE html> | |
<html lang="en"> | |
<head> | |
<meta charset="UTF-8"> | |
<title>Title</title> | |
</head> | |
<body> | |
<form action="/" method="post" novalidate> | |
<p>账号: {{ form.username }} {{ form.username.errors.0 }}</p> | |
<p>密码: {{ form.password }} {{ form.errors.password }}</p> | |
<p>重复: {{ form.RepeatPass }} {{ form.errors.RepeatPass }}</p> | |
<input type="submit" value="提交"> | |
</form> | |
</body> | |
</html> | |
# name:views.py | |
from django.shortcuts import render,HttpResponse | |
from django.forms import Form,fields,widgets | |
from django.core.exceptions import ValidationError | |
class LoginForm(Form): | |
username = fields.CharField( | |
required = True, | |
max_length = 10, | |
error_messages={"required":"该字段不能为空"}, | |
widget=widgets.TextInput(attrs={"placeholder":"请输入用户名","class":"form-control"}) | |
) | |
password = fields.CharField( | |
required = True, | |
max_length=10, | |
error_messages={"required":"密码字段不能为空","min_length":"密码最小长度为5"}, | |
widget=widgets.PasswordInput(attrs={"placeholder":"请输入密码","class":"form-control"}) | |
) | |
RepeatPass = fields.CharField( | |
required=True, | |
max_length=10, | |
error_messages={"required":"密码字段不能为空","min_length":"密码最小长度为5"}, | |
widget=widgets.PasswordInput(attrs={"placeholder":"重复输入密码","class":"form-control"}) | |
) | |
# 自定义方法(局部钩子)密码必须包含字母和数字 | |
def clean_password(self): | |
if self.cleaned_data.get("password").isdigit() or self.cleaned_data.get("password").isalpha(): | |
raise ValidationError("密码必须包含数字和字母") | |
else: | |
return self.cleaned_data["password"] | |
# 自定义方法(全局钩子, 检验两个字段),检验两次密码是否一致 | |
def clean_RepeatPass(self): | |
if self.cleaned_data.get("password") != self.cleaned_data.get("RepeatPass"): | |
raise ValidationError("两次输入密码不正确") | |
else: | |
return self.cleaned_data | |
def index(request): | |
if request.method =="GET": | |
form = LoginForm() | |
return render(request, "index.html", {"form": form}) | |
else: | |
form = LoginForm(request.POST) | |
if form.is_valid(): | |
# username = form.data['username'] | |
data = form.cleaned_data | |
username = data.get("username") | |
password = data.get("password") | |
print(username,password) | |
return render(request, "index.html", {"form": form}) | |
return render(request, "index.html", {"form": form}) |
其他常用Form表单
<!--name: index.html--> | |
<!DOCTYPE html> | |
<html lang="en"> | |
<head> | |
<meta charset="UTF-8"> | |
<title>Title</title> | |
</head> | |
<body> | |
<form action="/" method="post"> | |
{% for field in form %} | |
<p>{{ field.label_tag }} {{ field }} {{ field.errors.0 }}</p> | |
{% endfor %} | |
<input type="submit" value="提交" /> | |
</form> | |
</body> | |
</html> | |
# name: views.py | |
from django.shortcuts import render,HttpResponse | |
from django.forms import Form,fields,widgets | |
class MyForm(Form): | |
hobby = fields.ChoiceField( | |
label="单选框:", | |
required=True, | |
initial=1, # 默认选择1号 | |
choices=( (1,"篮球"),(2,"足球"),(3,"乒乓球"),(4,"滚球")), | |
widget=widgets.RadioSelect() | |
) | |
select = fields.ChoiceField( | |
label="单选框(默认):", | |
required=True, | |
initial=1, | |
choices=( (1,"篮球"),(2,"足球"),(3,"乒乓球"),(4,"滚球")), | |
widget=widgets.Select() | |
) | |
multiple = fields.MultipleChoiceField( | |
label="复选框", | |
choices=((1, "篮球"), (2, "足球"), (3, "羽毛球"), (4, "排球")), | |
initial=[2, 4], | |
widget=widgets.SelectMultiple() | |
) | |
checkbox = fields.ChoiceField( | |
label="单项复选框", | |
initial="checked", # 默认为勾选 | |
widget=widgets.CheckboxInput() | |
) | |
multselect = fields.MultipleChoiceField( | |
label="多项复选框", | |
choices=((1, "篮球"), (2, "足球"), (3, "羽毛球"), (4, "排球")), | |
initial=[1, 3], | |
widget=widgets.CheckboxSelectMultiple() | |
) | |
data = fields.DateField( | |
label="选择日期", | |
widget = widgets.DateInput(attrs={"type":"date"}) | |
) | |
def index(request): | |
if request.method=="GET": | |
form = MyForm() | |
return render(request,"index.html",{"form":form}) | |
else: | |
form = MyForm(request.POST) | |
if form.is_valid(): | |
data = form.cleaned_data | |
print(data.get("hobby")) | |
return HttpResponse("hello lyshark") |
Form实现用户注册
<!--name: index.html--> | |
<!DOCTYPE html> | |
<html lang="en"> | |
<head> | |
<meta charset="UTF-8"> | |
<title>Title</title> | |
</head> | |
<body> | |
<div> | |
<form action="/" method="post"> | |
<p>{{ form.username.label }} {{ form.username }}</p> | |
<p>{{ form.password.label }} {{ form.password }}</p> | |
<p>{{ form.mobile.label }} {{ form.mobile }} </p> | |
<p>{{ form.email.label }} {{ form.email }} </p> | |
<p>{{ form.text }} </p> | |
<p><input type="submit" value="提交请求"></p> | |
</form> | |
</div> | |
</body> | |
</html> | |
# name: models.py | |
from django.db import models | |
class User(models.Model): | |
id = models.AutoField(primary_key=True) | |
username = models.CharField(max_length=64) | |
password = models.CharField(max_length=32) | |
mobile = models.CharField(max_length=32) | |
email = models.EmailField(max_length=64) | |
text = models.CharField(max_length=128) | |
# name: views.py | |
from django.shortcuts import render,HttpResponse | |
from MyWeb import models | |
from django.forms import Form,fields,widgets | |
from django.core.validators import RegexValidator | |
from django.core.exceptions import ValidationError | |
class UserForm(Form): | |
username = fields.CharField( | |
label = "账号: ", # 给表单加一个标签 | |
required = True, # 不允许字段为空值 | |
min_length=4, # 设置最小长度 | |
max_length = 10, # 设置最大长度 | |
validators=[ RegexValidator(r'^[0-9a-zA-Z]+$',"用户账号只能使用,0-9a-z") ], | |
error_messages={"required":"该字段不能为空","invalid":"无效的用户名", | |
"min_length":"最小长度为5","max_length":"最大长度为10"}, | |
widget=widgets.TextInput(attrs={"placeholder":"请输入用户名","class":"form-control"}) | |
) | |
password = fields.CharField( | |
label = "密码: ", | |
required = True, | |
min_length=5, | |
max_length=10, | |
error_messages={"required":"密码字段不能为空","min_length":"密码最小长度为5"}, | |
widget=widgets.PasswordInput(attrs={"placeholder":"请输入密码","class":"form-control"}) | |
) | |
mobile = fields.CharField( | |
label = "手机: ", | |
required=True, | |
validators=[RegexValidator('[0-9]', "手机号必须是数字")], | |
error_messages={"required":"该字段不能为空"}, | |
widget=widgets.TextInput(attrs={"placeholder": "手机号","class": "form-control"}) | |
) | |
email = fields.EmailField( | |
label="邮箱: ", | |
required=True, | |
error_messages={"required":"邮箱不能为空!!","invalid":"无效的邮箱"}, | |
widget=widgets.EmailInput(attrs={"placeholder": "邮箱", "class": "form-control"}) | |
) | |
text = fields.CharField( | |
required=True, | |
widget=widgets.Textarea(attrs={"placeholder": "畅言,欢迎留言...", "class": "form-control", | |
"style":"margin: 0px; width: 203px; height: 98px;"}) | |
) | |
def index(request): | |
if request.method =="GET": | |
form = UserForm() | |
return render(request, "index.html", {"form": form}) | |
else: | |
form = UserForm(request.POST) | |
if form.is_valid(): | |
# username = form.data['username'] | |
data = form.cleaned_data | |
username = data.get("username") | |
is_exits = models.User.objects.filter(username="admin").count() | |
if is_exits != 0: | |
return HttpResponse("您注册的用户已存在") | |
else: | |
models.User.objects.create(**data) | |
return HttpResponse("恭喜您的账号注册完成了") | |
else: | |
return render(request, "index.html", {"form": form.errors}) | |
return render(request, "index.html", {"form": form}) |
实现用户验证
index.html
<head> | |
<meta charset="UTF-8"> | |
<script src="https://code.jquery.com/jquery-3.1.1.min.js"></script> | |
</head> | |
<body> | |
<form action="/" method="post"> | |
<p> {{ form.email }}</p> | |
<p> {{ form.code }} <a id="fetch_code" class="fetch-code" href="javascript:void(0);">获取验证码</a></p> | |
<input type="submit" value="提交"> | |
</form> | |
<script type="text/javascript"> | |
$("#fetch_code").click(function(){ | |
var email = $("#email").val(); // 获取到用户邮箱 | |
if(email.trim().length != 0) | |
{ | |
$("#fetch_code").empty(); | |
$("#fetch_code").text("发送成功"); | |
$.ajax({ | |
url:"/send_msg/", | |
type:"POST", | |
data:{email:email}, | |
dataType:"json", | |
success:function(recv){ | |
} | |
}) | |
} | |
}) | |
</script> |
models.py
from django.db import models | |
class SendMsg(models.Model): | |
id = models.AutoField(primary_key=True) | |
code = models.CharField(max_length=6) | |
email = models.CharField(max_length=32, db_index=True) | |
count = models.IntegerField(default=0) | |
times = models.IntegerField(default=0) | |
class UserInfo(models.Model): | |
id = models.AutoField(primary_key=True) | |
username = models.CharField(max_length=32, unique=True) | |
password = models.CharField(max_length=32) | |
email = models.CharField(max_length=32, unique=True) |
views.py
from django.shortcuts import render,HttpResponse | |
from django.core.mail import send_mail, send_mass_mail, EmailMultiAlternatives | |
import re,time,random | |
from MyWeb import models | |
def SendMail(rand,user): | |
title = "本次注册验证码是: {} 十分钟以内有效.".format(rand) | |
ret = send_mail("Django 邮件通知",title,"smtpwho@163.com",[user]) | |
if ret: | |
return 1 | |
return 0 | |
def send_msg(request): | |
if request.method=="POST": | |
email = request.POST.get("email") | |
ret = re.match(r'^[0-9a-zA-Z\_\-]+(\.[0-9a-zA-Z\_\-]+)*@[0-9a-zA-Z]+(\.[0-9a-zA-Z]+){1,}$', email) | |
if ret == None: | |
print("不合法") | |
else: | |
ret = models.UserInfo.objects.filter(email=email).count() | |
if ret == 1: | |
print("你的邮箱已经注册了,请换一个..") | |
else: | |
ret = models.SendMsg.objects.filter(email=email).count() # 查询出如果存在sendmsg表里,则不能让其注册 | |
if ret !=0: | |
print("等待超时,暂时不嫩注册..") | |
times = int(time.time()) | |
if times >=models.SendMsg.objects.filter(email=email).values("times"): | |
print(times) | |
else: | |
print("时间还没到") | |
else: | |
rand = random.randint(10000,20000) | |
if SendMail(rand,email): | |
times = int(time.time()+60) # 一分钟只能注册一次 | |
models.SendMsg.objects.create(email=email,code=rand,times=times) | |
return render(request,"reg.html") | |
def reg(request): | |
if request.method == "POST": | |
email = request.POST.get("email") | |
code = request.POST.get("code") | |
ret = models.SendMsg.objects.filter(email=email).values("email","code")[0] | |
if ret['email']==email and ret['code']==code: | |
print("正确了") | |
username = request.POST.get("username") | |
password = request.POST.get("password") | |
ret = models.UserInfo.objects.filter(username=username).count() | |
if ret == 0: | |
# 等于0说明没有这个用户,可以注册 | |
models.UserInfo.objects.create(username=username,password=password,email=email) | |
print("注册完成了") | |
else: | |
print("这个账号重复了,请换一个...") | |
else: | |
print("验证码错误") | |
return render(request, "reg.html") |
urls.py
from django.contrib import admin | |
from django.urls import path | |
from MyWeb import views | |
urlpatterns = [ | |
path('admin/', admin.site.urls), | |
path("reg/",views.reg), | |
path("send_msg/",views.send_msg) | |
] |
settings.py
STATIC_URL = '/static/' | |
EMAIL_USER_TLS = True | |
EMAIL_PORT = 25 | |
EMAIL_HOST = "smtp.163.com" | |
EMAIL_HOST_USER = "smtpwho@163.com" | |
EMAIL_HOST_PASSWORD = "123456789" |