Django的Form表单模块


自己在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中的字段或字段的参数。

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

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

猜你喜欢

转载自blog.csdn.net/weixin_42233629/article/details/84112468
今日推荐