整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

HTML-表单 211

单的作用就是采集用户填写的信息,将其发往服务器做相应的处理

表单的元素必须写在form标签中,一个form就是一个表单,表单中最重要的元素是input

input元素有一个type属性,type的可选值有:1)button(普通按钮)2checkbox(复选框)3text(单行文本框)4password(密码框)5radio(单选按钮)6image(图片按钮)7file(文件选择框)8hidden(隐藏字段)9<input type="file" />submit(提交按钮)10reset(重置按钮)

<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
    <title>表单元素</title>
</head>
<body>
    <form action="http://www.bd.com/register.aspx" method="post">
        用 户 名:<input type="text" value="张三" size="8" name="txtName" /><br /><br />
        用户密码:<input type="password" size="8" /><br /><br />
        用户性别:<input type="radio" name="rdGender" value="1" />男<input type="radio" name="rdGender"
            value="0" />女<br /><br />
        兴趣爱好:<input type="checkbox" value="0" checked="checked" />乒乓球<input type="checkbox" value="1" />篮球<input
            type="checkbox" value="2" />排球<br /><br />
        省市选择:省:<select>
            <option value="0">北京</option>
            <option selected="selected" value="1">河南</option>
            <option value="2">河北</option>
        </select>
        市:<select>
            <option value="0">密云</option>
            <option selected="selected" value="1">郑州</option>
            <option value="2">石家庄</option>
        </select><br /><br />
        上传文件:<input type="file" /><br/><br/>
        <textarea cols="50" rows="10" readonly="readonly">
				北京百度网讯科技有限公司
				统一社会信用代码/注册号:91110000802100433B
				注册资本:1342128万元
				法定代表人:梁志祥
				成立日期:2001-06-05
				营业期限:2001-06-05 至 长期
				企业类型:有限责任公司(自然人投资或控股)
				注册地址:北京市海淀区上地十街10号百度大厦2层
				经营范围:技术转让、技术咨询、技术服务、技术培训、技术推广;设计、开发、销售计算机软件;经济信息咨询;利用www.baidu.com、www.hao123.com(www.hao222.net、www.hao222.com)网站发布广告;设计、制作、代理、发布广告;货物进出口、技术进出口、代理进出口;医疗软件技术开发;委托生产电子产品、玩具、照相器材;销售家用电器、机械设备、五金交电(不含电动自行车)、电子产品、文化用品、照相器材、计算机、软件及辅助设备、化妆品、卫生用品、体育用品、纺织品、服装、鞋帽、日用品、家具、首饰、避孕器具、工艺品、钟表、眼镜、玩具、汽车及摩托车配件、仪器仪表、塑料制品、花、草及观赏植物、建筑材料、通讯设备、汽车电子产品、器件和元件、自行开发后的产品;预防保健咨询;公园门票、文艺演出、体育赛事、展览会票务代理;翻译服务;通讯设备和电子产品的技术开发;计算机系统服务;车联网技术开发;汽车电子产品设计、研发、制造(北京市中心城区除外);演出经纪;人才中介服;经营电信业务;利用信息网络经营音乐娱乐产品、演出剧(节)目、动漫产品、游戏产品(含网络游戏虚拟货币发行)、表演、网络游戏技法展示或解说(网络文化经营许可证有效期至2020年04月17日);因特网信息服务业务(除出版、教育、医疗保健以外的内容);图书、电子出版物、音像制品批发、零售、网上销售。(市场主体依法自主选择经营项目,开展经营活动;演出经纪、人才中介服务、利用信息网络经营音乐娱乐产品、演出剧(节)目、动漫产品、游戏产品(含网络游戏虚拟货币发行)、表演、网络游戏技法展示或解说、经营电信业务以及依法须经批准的项目,经相关部门批准后依批准的内容开展经营活动;不得从事国家和本市产业政策禁止和限制类项目的经营活动。)
			</textarea><br /><br />
        <input type="button" value="按钮" />
        <input type="submit" value="提交" />
        <input type="reset" value="重置" />
    </form>
</body>
</html>

还有一些次要的表单元素以后需要用到再说;关于浏览器兼容性自己测试不再截图

绝大多数表单元素必须有name与value属性,这样的表单元素才能将此元素的的value值传递给服务器;如果method属性值为get,点击submit这个按钮时在网址中就能看到填写的值

如果是radio(单选按钮)name属性值必须一样,这样此元素值就会只能选择其中一个

button:只是一个普通按钮,以后会通过JavaScript进行操作;submit:自动将填写在此网页表单元素的值发送给action指定的服务器相应的程序去处理;reset:将表单元素中填入的值还原为默认值

HTML表单

、概述

这是Flask Mega-Tutorial系列的第三部分,我将告诉你如何使用Web表单。

在第二章中我为应用主页创建了一个简单的模板,并使用诸如用户和用户动态的模拟对象。在本章中,我将解决这个应用程序中仍然存在的众多遗漏之一,那就是如何通过Web表单接受用户的输入。

Web表单是所有Web应用程序中最基本的组成部分之一。 我将使用表单来为用户发表动态和登录认证提供途径。

在继续阅读本章之前,确保你的microblog应用程序状态和上一章完结时一致,并且运行时不会报任何错误。

二、Flask-WTF简介和安装

在Flask中,处理应用程序中的Web表单,将使用到Flask-WTF扩展库,它是Flask和WTForms的简单集成,主要功能有:使用CSRF(Cross-site request forgery,译作 跨站请求伪造)令牌保护表单、文件上传、支持reCAPTCHA(译作 反全自动区分计算机和人类的图灵测试,简单点就是:验证码)。扩展是Flask生态系统中非常重要的一部分。今后还会需要更多的扩展。

我将使用Flask-WTF插件来处理本应用中的Web表单,它对WTForms进行了浅层次的封装以便和Flask完美结合。这是本应用引入的第一个Flask插件,但绝不是最后一个。插件是Flask生态中的举足轻重的一部分,Flask故意设计为只包含核心功能以保持代码的整洁,并暴露接口以对接解决不同问题的插件。

Flask插件都是常规的Python三方包,可以使用pip安装。 那就继续在你的虚拟环境中安装Flask-WTF吧:
进入虚拟环境中,安装Flask-WTF:

(venv) [root@python blog]# pip3 install flask-wtf

将附带安装WTForms,因为它是Flask-WTF的一部分。

2.1配置 configuration

目前为止,这个应用程序足够简单,无需担心它的配置。Flask(以及Flask扩展)在如何执行操作方面提供了很多自由,并需要做一些决定,并将这些决定作为一个配置变量列表传递给框架。

应用程序 有多种格式可指定配置选项。最基本的方案:在app.config这个字典中,将定义的变量作为键。形如:

app = Flask(__name__)app.config['SECRET_KEY'] = 'I am a secret, you can't guess.'#需要的话,可继续添加更多的变量

尽管上述语法可为Flask成功创建配置选项,但根据 关注点分离原则(Separation of concerns, SoC),所以不要将配置放在创建应用程序的相同位置,而是:将配置保存在单独的.py文件中,并使用类存储配置变量,将该.py文件放在项目顶级目录下。
/microblog/config.py:密钥配置

import os
class Config:
				SECRET_KEY = os.environ.get('SECRET_KEY') or 'you will never guess'

SECRET_KEY这个配置变量,将会被Flask及其扩展使用其值作为加密秘钥,用于生产签名或令牌。而Flask-WTF使用它来保护Web表单来免受CSFR攻击。

密钥的值 是具有两个术语的表达式,由or运算符连接。第一个术语是查找环境变量的值;第二个术语是一个硬编码的字符串。当然这个安全性还是很低的。当将应用程序部署在生产服务器上时,得设置一个安全级别高的。

其中os.environ是获取本机系统的各种信息(如环境变量等,你打印出来就明白了,哈哈),它是一个字典。我觉得os.environ.get('SECRET_KEY')在开发环境中并没有用,是None,不知部署后是什么。
有了上述这个配置文件,接下来得让Flask应用程序读取并应用它。在创建Flask应用程序实例后,就用app.config.from_object()方法完成:
app/__init__.py:Flask配置

from flask import Flask
from config import Config                #从config模块导入Config类


app = Flask(__name__)
app.config.from_object(Config)

from app import routes

查看刚才配置的密钥是什么:

(venv) [root@python blog]# python3
Python 3.9.0 (default, Oct 16 2020, 10:57:11)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-39)] on linux
Type "help", "copyright", "credits" or "license" for more information.
 >>> 

2.2用户登录表单

Flask-WTF扩展使用Python类来表示Web表单。表单类只是将表单的字段定义为类变量。

再次根据SoC(关注点分离原则),新建一个forms.py模块来存放Web表单类。在此,定义一个用户登录表单,要求用户输入用户名、密码,还包含“Remember Me”复选框、提交按钮。
app/forms.py:用户登录表单

from flask_wtf import FlaskForm        #从flask_wtf包中导入FlaskForm类
from wtforms import StringField,PasswordField,BooleanField,SubmitField       #导入这些类
from wtforms.validators import DataRequired 

class LoginForm(FlaskForm):    
					username = StringField('Username', validators=[DataRequired()])    
					password = PasswordField('Password', validators=[DataRequired()])    
					remember_me = BooleanField('Remember Me')
					submit = SubmitField('Sign In')

在Flask生态下,Flask扩展一般都使用flask_\这样的命名约定作为在模块中顶级导入的符号。在这个情况下,Flask-WTF的所有符号都在flask_wtf下,这也是FlaskForm基类在app/forms.py顶部导入的地方。

from wtforms import StringField,PasswordField,BooleanField,SubmitField

这条语句表示:这个用户登录表单的字段类型的4个类是直接从WTForms包导入的,因为Flask-WTF扩展是不提供自定义(字段类型?)版本。对于每个字段,将在LoginForm类中将对象创建为类变量。每个字段都有一个描述或标签作为第一个参数。

在某些字段中看到的可选参数validators将验证行为附加到字段中,如用户名、密码肯定是需要进行验证的。DataRequired验证器 只是简单地检查该字段不会提交为空。当然还有其他的验证器可用。

2.3用户登录-表单模板

有了上一步的登录表单,接下来得将表单添加到HTML模板中,让其在网页上呈现。
LoginForm类中定义的字段知道如何将自己渲染为HTML。
app/templates/login.html:用户登录表单模板

{% extends "base.html" %}
{% block content %}    
  <h1>Sign In</h1>
 			<form action="" method="post" novalidate>
        {{ form.hidden_tag() }}
				<p>
         {{ form.username.label }}<br>
          {{ form.username(size=32) }}
            </p>
				<p>
              {{ form.password.label }}<br>
              {{ form.password(size=32) }}
          </p>
					<p>
            {{ form.remember_me() }}
            {{ form.remember_me.label }}
							</p>
						<p>
                {{ form.submit() }}
             </p>
					</form>
{% endblock %}

这个用户登录表单模板使用了extends继承语句继承base.html模板,以确保一致的布局,即基础模板包含了所有页面的顶部导航栏。

在此的用户登录表单模板期望从LoginForm类实例化的表单对象作为参数给出,这个参数将由登录视图函数(目前还未编写)发送。

以下将讲述HTML知识,上述这段HTML代码中:<form>标签用作Web表单的容器。
其中action属性表示用于告知浏览器当用户在表单中输入信息提交时应使用的URL。该属性设置为空字符串时,表单将提交到当前位于地址栏的URL,即在页面上呈现表单的URL。
method属性用于指定在将表单提交到服务器时应使用的HTTP请求方法。默认情况下,是通过GET请求发送它。但几乎在所有情况下,使用POST请求会获得更好的用户体验,因为此类请求可在请求正文中提交表单数据,GET请求将表单字段添加到URL,会让浏览器地址栏变得混乱。
novalidate属性用于告知浏览器不对此表单中的字段运用验证,这有效地将此任务留给服务器中运行的Flask应用程序。当然,使用novalidate完全是可选的,但对于第一种形式,设置它是很重要的,因为这将允许在本章后面的测试服务器端验证。
form.hidden_tag()这个模板参数 生成一个隐藏字段,其中包括用来防止CSRF攻击的令牌。要使表单受保护,需要做的是包含此隐藏字段,并在Flask配置中定义的SECRET_KEY变量。
写过HTML Web表单的同学可能会发现这个模板中没有HTML字段,这是因为表单对象中的字段知道如何将自己呈现(渲染)为HTML,需要做的就是{ form.<field_name>.label }需要的字段标签、{ form.<field_name>() }需要的字段。对于需要其他HTML属性的字段,可将这些属性作为参数传递。此模板中的用户名、密码字段将size作为参数添加到<input>这个HTML标签作为属性。这还是可将CSS类、或ID附加到表单字段的方法。

2.4用户登录-表单视图

在编写完上一步的用户登录表单模板后,想要在浏览器中看到此表单的最后一步是:在应用程序中编写一个它的视图函数,用于渲染该模板。

因此,编写一个映射到/login URL的视图函数login(),并将其传递给模板进行渲染。在routes模块中增加代码:

app/routes.py:用户登录视图函数

from flask import render_template
from app import app
from app.forms import LoginForm

#...
 
@app.route('/login')
def login():
				form = LoginForm()          #表单实例化对象
        return render_template('login.html', title='Sign In', form=form)

上述视图函数很简单,从forms.py模块中导入LoginForm类,然后实例化该类,最后将其发送到模板。form=form,return中将form实例对象赋值给form变量,这将获得表单字段所需的全部内容。

为了便于访问登录表单,在基础模板中改进,即在导航栏中包含指向它的链接:
app/templates/base.html:导航栏中增加登录链接

<div>   
  	Microblog:    
      			<a href="/index">Home</a>
						<a href="/login">Login</a>
</div>

此刻,运行应用程序就可浏览器中查看该表单了。效果:图略

2.5接收表单数据

尝试点击上述“Sign In”提交按钮,浏览器将出现405错误“Method Not Allowed”。图略

在上一步中,用户登录的视图函数执行了一半的工作,即可在网页上显示表单。但它没有处理用户提交的数据的逻辑。这是Flask-WTF让这项逻辑处理变得非常简单的优势。更新用户登录视图函数代码,它接受、验证用户提交的数据:
app/routes.py:接收登录凭据

from flask import render_template,flash,redirect 
@app.route('/login',methods=['GET','POST'])
def login():
				form = LoginForm()
				if form.validate_on_submit():
          				flash('Login requested for user {},remember_me={}'.format(form.username.data,form.remember_me.data))
									return redirect('/index')
				return render_template('login.html',title='Sign In',form=form)

在@app.routes()装饰器中参数methods作用是:告诉Flask这个视图函数接受GET和POST请求方法,覆盖默认值(即只接受GET请求)。HTTP协议中,GET请求是将信息返回给客户端(如浏览器)的请求,到目前为止,该应用程序中的所有请求都属于这种类型;POST 请求通常在浏览器上服务器提交表单数据时使用。上述出现“Method Not Allowed”,是因为浏览器尝试发送POST请求,而应用程序没有配置去接受它。

form.validate_on_submit()方法完成所有表单处理工作。当浏览器发送GET接收带有表单的网页请求时,此方法将返回False,此时函数会跳过if语句并直接在函数的最后一行呈现模板。
当用户在浏览器按下提交按钮时,浏览器发送POST请求,form.validate_on_submit()将收集所有数据,运行附加到字段的所有验证器,如果一切正常,它将返回True,表明数据有效且可由应用程序处理。但如果至少有一个字段未通过验证,则函数就会返回False,接着就像上述GET请求那样。
当form.validate_on_submit()返回True,这个登录视图函数将调用两个函数,分别是flash()、redirect(),均从flask包导入的。
flash() 用于向用户显示消息,如让用户知道某些操作是否成功。目前为止,将使用其机制作为临时解决方案,因为暂无用户登录
真实所需的基础结构,此时只是显示一条消息用于确认应用程序已收到凭据。
redirect()用于指示客户端(浏览器)自动导航到作为参数给出的其他页面(如上述代码中的/index页面,即重定向到应用程序的/index页面)。

当调用flash()函数时,Flask会存储该消息,但闪烁的消息不会神奇地出现在Web页面中。应用程序的模板需要以适用于站点布局的方式呈现/渲染这些闪烁的消息。因此,将这些消息添加到基础模板中,以便所有模板都继承此功能。更新基础模板:
app/templates/base.html:基础模板中的闪烁消息

<html>    
  <head>
  {% if title %}
<title>{{ title }} - Microblog</title>
	{% else %}
    <title>Welcome to Microblog</title>
  {% endif %}
    </head>
   <body>
    	<div>
      			Microblog:
              <a href="/index">Home</a>
   						<a href="/login">Login</a>
   			</div>
   			<hr>
      {% with messages = get_flashed_messages() %}
      {% if messages %} 
        <ul>
          {% for message in messages %}
       					<li>{{ message }}</li>
    			{% endfor %}
          </ul>
          {% endif %}
          {% endwith %}
          {% block content %}
          {% endblock %}
    </body>
   </html>

上述代码中,使用with结构将调用get_flashed_messages()的结果分配给变量messages,都在模板的上下文。这个get_flashed_messages()函数来自Flask,并返回flash()之前已注册的所有消息的列表。接着if语句判断messages是否具有某些内容,在这种情况下,一个ul标签被渲染成每个消息作为一个li标签列表项。而这种渲染风格看起来不太好,但Web应用程序样式化的主题将在稍后出现。

这些闪烁的消息的一个有趣属性是:一旦通过get_flashed_messages()请求它们,它们就会从列表中删除,因此它们在flash()调用后只出现一次。

运行程序,再次测试表单是如何工作的。确保将用户名或密码字段为空来提交表单,以查看DataRequired验证器如何暂停提交过程。

用户名或密码为空时提交表单,网页没反应。都不为空时,随意输入。
图略

点击Sign in按钮后,倒是出现了一条消息:Login requested for user 123456@qq.com,remember_me=Flase
图略

2.6增强字段验证

附加到表单字段的验证器可防止无效数据接受到应用程序中。应用程序处理无效表单输入的方式是重新显示表单,让用户进行必要的更正。

当提交无效数据时,却没有明显提示用户提交的数据有问题,只是重新返回表单,这将影响用户体检。因此,现在的任务是:通过在验证失败的每个字段傍边增加有意义的错误提示来改善用户体验。

实际上,表单验证器已经生成了这些描述性错误消息,因此,缺少的是在模板中用于渲染/呈现它们的一些额外逻辑。在用户登录模板的用户名、密码字段中添加字段验证消息:更新代码
app/templates/login.html:提示字段验证错误消息

{% extends "base.html" %}
{% block content %}
  <h1>Sign In</h1>
 				<form action="" method="post" novalidate>
          {{ form.hidden_tag() }}
						<p>
                  {{ form.username.label }}<br>
                   {{ form.username(size=32) }}<br>
                   {% for error in form.username.errors %}
                    <span style="color:red;">[{{ error }}]</span>
										{% endfor %}
              </p>
               <p>
                    {{ form.password.label }}<br>
                    {{ form.password(size=32) }}<br>
                    {% for error in form.password.errors %}
                    <span style="color:red;">[{{ error }}]</span>
										{% endfor %}
                 </p>
                  <p>
                   {{ form.remember_me() }}
                   {{ form.remember_me.label }}
										</p>
										<p>
                      {{ form.submit() }}
                     </p> 
</form>
{% endblock %}

上述代码中,只是在用户名、密码字段之后添加for循环,以红色字体消息渲染错误消息。一般规则下,任何附加验证器的字段都会通过form.<field_name>.errors添加错误消息。这将是一个列表,因为字段可以附加多个验证器,并且多个可能提供错误消息提示给用户。

如果尝试提交空用户名或密码的表单,将看到红色错误提示,效果:图略

2.7生成URL

用户登录表单现在比较完整了,下面将学习在模板包含链接和重定向的方法。 例:基础模板中的当前导航栏

<div>     
  Microblog:
    <a href="/index">Home</a>
		<a href="/login">Login</a>
</div>

登录视图函数还定义了传递给redirect()函数的链接:

@app.route('/login', methods=['GET', 'POST'])
def login():
				form = LoginForm()
				if form.validate_on_submit():
        # ...
        return redirect('/index')
					# ...

直接在模板、源文件中编写链接的一个问题是:如果将来某天要重新组织链接,将不得不修改整个应用程序的这个链接,搜索、替换。

为更好地控制这些链接,Flask提供了一个名为 url_for()函数,它使用URL的内部映射到视图函数来生成URL。例:url_for('login')返回/login;url_for('index')返回/index。url_for()中的参数就是端点名称,也就是视图函数的名字。

使用函数名称而不是URL的优点:URL比视图函数名称更可能发生变化;某些URL很可能包含动态组件,手动生成这URL需要连接多个元素,这极易出错,而url_for()能生成这些复杂的URL。

因此,今后每次应用程序要生成URL时,都使用url_for()。
更新基础模板中的代码:
app/templates/base.html:使用url_for()进行链接

...    
  <div>
  Microblog:
    <a href="{{ url_for('index') }}">Home</a>
     <a href="{{ url_for('login') }}">Login</a>
    </div>
       ...

更新login()视图函数中的代码:
app/routes.py:对链接使用url_for()函数

from flask import render_template, flash, redirect, url_for 

# ...
  
@app.route('/login', methods=['GET', 'POST'])

def login():   
				form = LoginForm()
				if form.validate_on_submit():
        # ... 
        return redirect(url_for('index'))
				# ...

目前为止,项目结构:

了使用模板语言和 CSS 框架来美化表单数据展示界面之外,还可以使用一些 JavaScript 库和框架来为表单添加更多的交互和动态效果。下面介绍一些常用的 JavaScript 库和框架:

  1. jQuery:是一个快速、简洁的 JavaScript 库,提供了丰富的操作 HTML 文档、处理事件、发送 Ajax 请求等功能,可以大大简化 JavaScript 编程工作。
  2. Vue.js:是一个轻量级、渐进式 JavaScript 框架,专注于构建用户界面。它采用组件化开发模式,可以将表单拆分成多个小组件来开发和管理。
  3. React:是一个由 Facebook 开发的 JavaScript 库,用于构建高性能、可扩展的用户界面。它使用虚拟 DOM 技术,可以快速更新界面并减少 Web 应用程序的加载时间。
  4. AngularJS:是一个由 Google 开发的 JavaScript 框架,用于构建动态 Web 应用程序。它使用 MVC 架构模式,可以将表单数据和界面进行分离,从而实现更好的代码组织和管理。

这些 JavaScript 库和框架都具有不同的特点和优势,可以根据项目需求和开发者的技能水平选择合适的工具和技术来开发表单应用程序。

同时,还需要注意在使用 JavaScript 库和框架时,要遵循良好的编程习惯和安全性要求,避免出现潜在的安全漏洞和性能问题。例如,要避免 XSS 攻击、CSRF 攻击等 Web 安全问题,并合理使用缓存技术、压缩代码、异步加载等优化方法,提高 Web 应用程序的性能和响应速度。

还可以使用一些表单美化工具和插件来为表单添加更多的样式和效果。下面介绍一些常用的表单美化工具和插件:

  1. Bootstrap Form Helpers:是一个基于 Bootstrap 的表单美化插件,提供了多种 UI 组件和样式,例如日期选择器、颜色选择器、下拉框等,可以大大简化表单开发工作。
  2. jQuery Form Styler:是一个 jQuery 插件,可以将原生 HTML 表单元素转换成美观且易于操作的 UI 组件,例如滑块、选择器、复选框等,支持自定义皮肤和主题。
  3. Select2:是一个功能强大的选择框插件,支持搜索、多选、分组等高级功能,可以大大提升表单的交互效果和用户体验。
  4. Chosen:也是一个选择框插件,支持自动完成、多选、禁用等功能,具有轻量级和易用性的特点。

这些表单美化工具和插件都具有不同的功能和特点,可以根据项目需求和开发者的喜好选择合适的工具和技术来美化表单应用程序。

--------------------下面我来详细介绍一下样例代码。-------------------

首先是 user_info.html 模板代码:

<!-- user_info.html -->

<h1>User Information:</h1>

<ul>
    <li><strong>Username:</strong> {{ user.username }}</li>
    <li><strong>Email:</strong> {{ user.email }}</li>
    <li><strong>First Name:</strong> {{ user.first_name }}</li>
    <li><strong>Last Name:</strong> {{ user.last_name }}</li>
</ul>

这个模板简单地将表单数据渲染为一个无序列表,并使用了 Django 的模板语言来引用表单数据字段。例如,{{ user.username }} 引用了表单数据中的用户名字段。同时,我们使用了 HTML 和 CSS 来设置标记和样式来美化数据展示界面。

然后是 user_info_bootstrap.html 模板代码:

<!-- user_info_bootstrap.html -->

<div class="panel panel-default">
    <div class="panel-heading"><h3 class="panel-title">User Information:</h3></div>
    <div class="panel-body">
        <dl class="dl-horizontal">
            <dt>Username:</dt>
            <dd>{{ user.username }}</dd>
            <dt>Email:</dt>
            <dd>{{ user.email }}</dd>
            <dt>First Name:</dt>
            <dd>{{ user.first_name }}</dd>
            <dt>Last Name:</dt>
            <dd>{{ user.last_name }}</dd>
        </dl>
    </div>
</div>

这个模板使用 Bootstrap 的面板和横向列表组件来美化表单数据展示界面。通过使用 Bootstrap,我们可以为表单添加丰富的样式和效果,使其看起来更加现代和专业。

最后是 user_info_vue.html 模板代码:

<!-- user_info_vue.html -->

<div id="app">
    <h1>User Information:</h1>
    <ul>
        <li><strong>Username:</strong> {{ user.username }}</li>
        <li><strong>Email:</strong> {{ user.email }}</li>
        <li><strong>First Name:</strong> {{ user.first_name }}</li>
        <li><strong>Last Name:</strong> {{ user.last_name }}</li>
    </ul>
</div>

<script src="https://cdn.jsdelivr.net/npm/vue"></script>
<script>
    var app = new Vue({
        el: '#app',
        data: {
            user: {
                username: 'JohnDoe',
                email: 'johndoe@exemple.com',
                first_name: 'John',
                last_name: 'Doe'
            }
        }
    })
</script>

这个模板使用了 Vue.js,将表单数据渲染为一个无序列表,并使用了 Vue.js 的数据绑定功能来实现动态更新。在这个示例中,我们不需要从服务器加载表单数据,而是直接在客户端定义了一个模拟数据。Vue.js 通过将数据绑定到 HTML 元素上,可以自动更新界面,并提供了方便的开发工具和调试方法,帮助我们快速构建复杂的用户界面。

总之,以上三个模板代码都使用了不同的技术和框架来展示表单数据。每种技术和框架都有其特点和优势,可以根据项目需求和开发者的技能水平选择合适的技术和工具来开发表单应用程序。无论我们使用何种技术和框架,都需要注意编程规范和安全防范措施,提高应用程序的质量和可靠性。

--------------------样例代码--------------

当我们展示表单数据时,需要对数据进行适当的格式化和排版,以确保数据的可读性和美观性。可以使用 Django 提供的模板语言来处理表单数据,并选择合适的 HTML 和 CSS 样式来呈现数据。

下面是一个简单的表单数据展示示例,展示了一个用户信息表单的数据:

<!-- user_info.html -->

<h1>User Information:</h1>

<ul>
    <li><strong>Username:</strong> {{ user.username }}</li>
    <li><strong>Email:</strong> {{ user.email }}</li>
    <li><strong>First Name:</strong> {{ user.first_name }}</li>
    <li><strong>Last Name:</strong> {{ user.last_name }}</li>
</ul>

在这个模板中,我们使用了 Django 的模板语言来引用表单数据字段。例如,{{ user.username }} 引用了表单数据中的用户名字段。同时,我们使用了 HTML 和 CSS 来设置标记和样式来美化数据展示界面。

如果您想要进一步美化表单数据展示界面,可以使用第三方 CSS 框架,例如 Bootstrap、Semantic UI 等,来为表单添加更多的样式和效果。下面是一个使用 Bootstrap 美化的示例代码:

<!-- user_info_bootstrap.html -->

<div class="panel panel-default">
    <div class="panel-heading"><h3 class="panel-title">User Information:</h3></div>
    <div class="panel-body">
        <dl class="dl-horizontal">
            <dt>Username:</dt>
            <dd>{{ user.username }}</dd>
            <dt>Email:</dt>
            <dd>{{ user.email }}</dd>
            <dt>First Name:</dt>
            <dd>{{ user.first_name }}</dd>
            <dt>Last Name:</dt>
            <dd>{{ user.last_name }}</dd>
        </dl>
    </div>
</div>

在这个模板中,我们使用了 Bootstrap 的面板和横向列表组件来美化表单数据展示界面。使用 Bootstrap 可以为表单添加丰富的样式和效果,使其看起来更加现代和专业。