Django的Form表单模块

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_42233629/article/details/84112468


自己在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)
]

views.py

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模块

  • 作用
    1. 不用自己写form表单的HTML页面
    2. 对用户输入做验证
    3. 展示错误提示信息并且保存用户原来填写的内容。
      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中的字段或字段的参数。

在这里插入图片描述
对表中的数据进行修改
方法一
在这里插入图片描述
方法二
还有一种更简洁的方法
在这里插入图片描述

  • 修改数据
    在这里插入图片描述

form源码解析

ModelForm

在这里插入图片描述

  • 继承的第一个类(元类信息)
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • 继承的第二个类
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

Form类

在这里插入图片描述

  • 继承的第一个类(元类信息)
    在这里插入图片描述
  • 继承的第二个类:BaseForm。

根据源码进行解析

  • 创建继承了FormModel的类的对象后,不传参就能生成空的form表单,可以在html显示

在这里插入图片描述
在这里插入图片描述
输出结果

<tr><th><label for="id_qq">QQ:</label></th><td><input type="text" name="qq" maxlength="64" class="form-control" required id="id_qq" /><br /><span class="helptext">QQ号必须唯一</span></td></tr>
<tr><th><label for="id_qq_name">QQ昵称:</label></th><td><input type="text" name="qq_name" maxlength="64" class="form-control" id="id_qq_name" /></td></tr>
<tr><th><label for="id_name">姓名:</label></th><td><input type="text" name="name" maxlength="32" class="form-control" id="id_name" /><br /><span class="helptext">学员报名后,请改为真实姓名</span></td></tr>
<tr><th><label for="id_sex">性别:</label></th><td><select name="sex" class="form-control" id="id_sex">
  <option value="">---------</option>

  <option value="male" selected></option>

  <option value="female"></option>

</select></td></tr>
<tr><th><label for="id_birthday">出生日期:</label></th><td><input type="text" name="birthday" class="form-control" id="id_birthday" /><br /><span class="helptext">格式yyyy-mm-dd</span></td></tr>
<tr><th><label for="id_phone">手机号:</label></th><td><input type="number" name="phone" min="-9223372036854775808" max="9223372036854775807" class="form-control" id="id_phone" /></td></tr>
<tr><th><label for="id_source">客户来源:</label></th><td><select name="source" class="form-control" id="id_source">
  <option value="qq" selected>qq群</option>

  <option value="referral">内部转介绍</option>

  <option value="website">官方网站</option>

  <option value="baidu_ads">百度推广</option>

  <option value="office_direct">直接上门</option>

  <option value="WoM">口碑</option>

  <option value="public_class">公开课</option>

  <option value="website_luffy">路飞官网</option>

  <option value="others">其它</option>

</select></td></tr>
<tr><th><label for="id_introduce_from">转介绍自学员:</label></th><td><select name="introduce_from" class="form-control" id="id_introduce_from">
  <option value="" selected>---------</option>

  <option value="1">吴春香</option>

  <option value="2">黎事</option>

</select></td></tr>
<tr><th><label for="id_course">咨询课程:</label></th><td><select name="course" class="form-control" required id="id_course" multiple="multiple">
  <option value="Linux">Linux中高级</option>

  <option value="PythonFullStack">Python高级全栈开发</option>

  <option value="Go">Golang高级开发</option>

</select></td></tr>
<tr><th><label for="id_class_type">班级类型:</label></th><td><select name="class_type" class="form-control" id="id_class_type">
  <option value="fulltime" selected>脱产班</option>

  <option value="online">网络班</option>

  <option value="weekend">周末班</option>

</select></td></tr>
<tr><th><label for="id_customer_note">客户备注:</label></th><td><textarea name="customer_note" cols="40" rows="10" class="form-control" id="id_customer_note">
</textarea></td></tr>
<tr><th><label for="id_status">状态:</label></th><td><select name="status" class="form-control" id="id_status">
  <option value="signed">已报名</option>

  <option value="unregistered" selected>未报名</option>

  <option value="studying">学习中</option>

  <option value="paid_in_full">学费已交齐</option>

</select><br /><span class="helptext">选择客户此时的状态</span></td></tr>
<tr><th><label for="id_network_consult_note">网络咨询师咨询内容:</label></th><td><textarea name="network_consult_note" cols="40" rows="10" class="form-control" id="id_network_consult_note">
</textarea></td></tr>
<tr><th><label for="id_next_date">预计再次跟进时间:</label></th><td><input type="text" name="next_date" class="form-control" id="id_next_date" /></td></tr>
<tr><th><label for="id_network_consultant">咨询师:</label></th><td><select name="network_consultant" class="form-control" id="id_network_consultant">
  <option value="" selected>---------</option>

  <option value="1">547400748@qq.com</option>

  <option value="2">277611453@qq.com</option>

  <option value="4">12@sina.com</option>

</select></td></tr>
<tr><th><label for="id_consultant">销售:</label></th><td><select name="consultant" class="form-control" id="id_consultant">
  <option value="" selected>---------</option>

  <option value="1">547400748@qq.com</option>

  <option value="2">277611453@qq.com</option>

  <option value="4">12@sina.com</option>

</select></td></tr>
<tr><th><label for="id_class_list">已报班级:</label></th><td><select name="class_list" class="form-control" id="id_class_list" multiple="multiple">
  <option value="1">Golang高级开发</option>

  <option value="2">Linux中高级</option>

</select></td></tr>
[22/Nov/2018 18:38:41] "GET /crm/add/ HTTP/1.1" 200 9862

页面显示结果
在这里插入图片描述
在这里插入图片描述
问题来了,为什么打印此对象就能生成每个字段的input便签呢
源码追溯:
在这里插入图片描述

总之人家已经封装好了类,直接调用人家的写好的方法就可以了

  • 传的参数为request.POST后,也就是一个字典后,就能生成一个新的form表单,form表单中有内容或被选中的选项。

    还是以上的类,
    传的参数提交的页面上用户填写的值
    在这里插入图片描述
    打印a的结果与填写的表单对应关系
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

在这里插入图片描述
源码解析
在这里插入图片描述

  • 以上内容直接save就可以在数据库创建一个新的对象
    在这里插入图片描述
    刚刚提交的数据已经在数据库创建好了。
    在这里插入图片描述
    save方法源码解析
    在这里插入图片描述
  • 把新增客户和编辑客户的函数合并为一个函数。
    在这里插入图片描述
展开阅读全文

没有更多推荐了,返回首页