zoukankan      html  css  js  c++  java
  • Django笔记&教程 6-2 表单(Form)基础操作

    Django 自学笔记兼学习教程第6章第2节——表单(Form)基础操作
    点击查看教程总目录

    1 - 编写表单类

    创建新的表单类的代码,一般写到一个专门的forms.py文件中(一般放在对应的app文件夹下)

    在本章第一小节,我们已经展示了如何去创建表单类的代码,这里我们详细看看这些代码

    #usr/bin/env python
    #-*- coding:utf-8- -*-
    from django import forms
    
    class LoginForm(forms.Form):
        uid = forms.CharField(label='ID', max_length=10)
        password = forms.CharField(label='password', max_length=30, widget=forms.PasswordInput)
    

    首先第1行从django库中导入了forms库,
    我们创建表单时,常常需要用到forms中的:

    • forms.Form: 必用,继承该表单类去创建自己需要的表单
    • 各种Field: 几乎必用,定义自己表单类中需要的字段
    • 各种widget: 常用,定义表单字段的一些规则。

    第3行继承forms.Form编写自己的表单类LoginForm
    新表单类的命名一般以Form结尾,没有什么太多的要求,按常规的命名类的规则来就行,表达清楚该表单的功能和意义即可。

    第4、5行设置表单需要的字段,其中的Field和之前models中的Field十分相似,写法上也差不多。
    使用时主要的区别有:

    • 标签文本,forms中的Fieldlabel指定,models中的Fieldverbose_name指定,
    • forms中的Fieldmodels中的Field多了个widget属性

    这里第5行中的widget属性forms.PasswordInput代表这是个密码字段,填写时会隐藏其输入的内容

    2 - 操作表单

    新建表单对象,即实例化表单:

    form = LoginForm()
    

    这是一个没有数据的空表单,用户提交表单信息的页面,一般使用的是这样的空表单。
    通过render方法传递给模板进行渲染,比如本章第一节中的代码:

    return render(request, 'login.html', {'form': form})
    

    当用户填写表单信息之后,提交表单时,必须使用POST方法提交,
    此时视图中,可以直接使用表单数据来新建一个表单对象,代码如下

    form = LoginForm(data=request.POST)
    

    不过用户提交的表单信息不一定就是符合规则的,这个时候需要对表单进行一个数据检查
    form.is_valid()
    使用表单类的is_valid方法即可,返回值为True则代表其数据是通过验证的。

    通过验证后,我们将可以使用表单类的cleaned_data属性,找到所有已验证的表单数据。
    而表单类的cleaned_data属性,是一个字典,获取其中的属性,就是很简单的了:
    uid = form.cleaned_data["uid"]

    3 - 渲染表单

    视图方法给Django Template(模板)中传入一个form对象后,想要在模板中渲染出来,
    可以直接使用{{ form }},该语法将适当地渲染form对象的

    除了<label>/<input>对,还有其他的输出选项:

    • {{ form.as_table }}将把它渲染成包含在<tr>标签中的表格单元格
    • {{ form.as_p }}将把它们包装在<p>标签中
    • {{ form.as_ul }}将把它们包装在<li>标签中

    注意:表单的渲染输出不包括周围的<form><table>或者<ul>标记,也不包括表单的submit控件,这些需要我们去写。

    补充:其实直接使用{{ form }}和使用{{ form.as_table }}是一样的,前者是通过默认调用后者实现的。

    这里我们举个例子,具体展示下这三个输出方法的区别
    使用本章第一节中展示的代码,临时性的修改下其中的login.html如下,来观察下这几种渲染方式的不同

    <html>
    <head>
        <title>login</title>
    </head>
    <body>
        <h1>Use form.as_table </h1>
        <form method="post" action="{% url "login" %}">
            {% csrf_token %}
            <table>
            {{ form.as_table }}
            </table>
            <p><input type="submit" value="Log in" /></p>
        </form>
    
        <h1>Use form.as_p</h1>
        <form method="post" action="{% url "login" %}">
            {% csrf_token %}
            {{ form.as_p }}
            <p><input type="submit" value="Log in" /></p>
        </form>
    
        <h1>Use form.as_ul</h1>
        <form method="post" action="{% url "login" %}">
            {% csrf_token %}
            <ul>
            {{ form.as_ul }}
            </ul>
            <p><input type="submit" value="Log in" /></p>
        </form>
    
    </body>
    </html>
    

    其渲染后的效果如下图:
    在这里插入图片描述

    下面我们细看一下这三种方法渲染后输出的HTML代码
    {{ form.as_table }}:

    <tr><th><label for="id_id">ID:</label></th><td><input type="text" name="id" maxlength="30" required id="id_id"></td></tr>
    <tr><th><label for="id_password">Password:</label></th><td><input type="password" name="password" maxlength="30" required id="id_password"></td></tr>
    

    {{ form.as_p }}:

    <p><label for="id_id">ID:</label> <input type="text" name="id" maxlength="30" required id="id_id"></p>
    <p><label for="id_password">Password:</label> <input type="password" name="password" maxlength="30" required id="id_password"></p>
    

    {{ form.as_ul }}:

    <li><label for="id_id">ID:</label> <input type="text" name="id" maxlength="30" required id="id_id"></li>
    <li><label for="id_password">Password:</label> <input type="password" name="password" maxlength="30" required id="id_password"></li>
    
  • 相关阅读:
    【Spring】 AOP Base
    【Offer】[20] 【表示数值的字符串】
    【Offer】[19] 【字符串匹配】
    【设计模式】代理模式
    【LeetCode】[0002] 【两数之和】
    【Offer】[18-1] 【在O(1)时间内删除链表节点】
    【Offer】[18-2] 【删除链表中重复的节点】
    【Offer】[17] 【打印1到最大的n位数】
    【Offer】[16] 【数值的整数次方】
    python_内置函数
  • 原文地址:https://www.cnblogs.com/BigShuang/p/14285594.html
Copyright © 2011-2022 走看看