2025年Django 之Form表单的常用操作

Django 之Form表单的常用操作Django Form 是 Django 框架中用于处理 HTML 表单的一种机制 它提供了一种简化处理表单数据的方式 包括数据验证 HTML 渲染 以及与数据库模型的集成 使用 Django Form 可以更轻松地处理用户输入 并确保输入数据的有效性和安全性 普通 Form 表单的提交 name index html lt

大家好,我是讯享网,很高兴认识大家。

Django Form是Django框架中用于处理HTML表单的一种机制。它提供了一种简化处理表单数据的方式,包括数据验证、HTML渲染、以及与数据库模型的集成。使用Django Form可以更轻松地处理用户输入,并确保输入数据的有效性和安全性。

普通Form表单的提交

<!-- name:index.html -->
<!DOCTYPE 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 = "" EMAIL_HOST_PASSWORD = ""
小讯
上一篇 2025-04-05 13:51
下一篇 2025-03-30 16:11

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/121469.html