Python中Django或Flask等Web框架如何使用form表单模型?
使用 django 开发快两年了,开发过程中没有用过表单模型这东西,貌似也没有见周围人有用过。
大家开发过程中会在后台写表单模型吗?
Python中Django或Flask等Web框架如何使用form表单模型?
我不用。
主要是错误提示不好弄。
在Django和Flask里,处理表单的方式不太一样。Django有自己一套完整的表单系统,而Flask更灵活,通常搭配WTForms来用。
Django的表单模型
Django的表单类在forms.py里定义,它直接映射到模型(Model),能自动生成HTML表单并处理验证。看个例子,假设我们有个Article模型:
# models.py
from django.db import models
class Article(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
published_date = models.DateTimeField(auto_now_add=True)
对应的表单可以这么写:
# forms.py
from django import forms
from .models import Article
class ArticleForm(forms.ModelForm):
class Meta:
model = Article
fields = ['title', 'content'] # 指定表单包含的字段
widgets = {
'content': forms.Textarea(attrs={'rows': 4, 'cols': 40}),
}
在视图里使用这个表单:
# views.py
from django.shortcuts import render, redirect
from .forms import ArticleForm
def create_article(request):
if request.method == 'POST':
form = ArticleForm(request.POST)
if form.is_valid():
form.save() # 直接保存到数据库
return redirect('article_list')
else:
form = ArticleForm()
return render(request, 'create_article.html', {'form': form})
模板里渲染表单很简单:
<!-- create_article.html -->
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">提交</button>
</form>
Flask + WTForms的表单模型
Flask本身没有内置表单系统,用WTForms是标准做法。先定义表单类:
# forms.py
from flask_wtf import FlaskForm
from wtforms import StringField, TextAreaField, SubmitField
from wtforms.validators import DataRequired, Length
class ArticleForm(FlaskForm):
title = StringField('标题', validators=[DataRequired(), Length(max=200)])
content = TextAreaField('内容', validators=[DataRequired()])
submit = SubmitField('提交')
在视图函数里处理:
# app.py
from flask import Flask, render_template, redirect, url_for
from forms import ArticleForm
app = Flask(__name__)
app.config['SECRET_KEY'] = 'your-secret-key'
@app.route('/create', methods=['GET', 'POST'])
def create_article():
form = ArticleForm()
if form.validate_on_submit():
# 这里通常是把数据存入数据库,例如用SQLAlchemy
# new_article = Article(title=form.title.data, content=form.content.data)
# db.session.add(new_article)
# db.session.commit()
return redirect(url_for('index'))
return render_template('create.html', form=form)
对应的Jinja2模板:
<!-- create.html -->
<form method="post">
{{ form.hidden_tag() }}
<p>{{ form.title.label }}<br>{{ form.title(size=32) }}</p>
<p>{{ form.content.label }}<br>{{ form.content(rows=4, cols=40) }}</p>
<p>{{ form.submit() }}</p>
</form>
简单总结
Django的表单和模型绑定紧密,适合快速开发;Flask搭配WTForms则更灵活轻量。根据项目需求选就行。
我用过 Django 的 ModelForm,其实很好用,体现了 DRY 的原则,开发效率超高。数据检验方法都带了,实现上也是生成的前端 js 在前端检验。但是现在都做前后端分离的项目了用的就机会少了。
用的 restframework,前后端分离表示用不到 form
flask-wtf 也不错,主要用它的 csrf-token 防止跨站攻击。顺道在需要的时候可以用下它的表单类,表单验证很轻松。
用不用看需求,看情况,看心情。
之前刚开始使用 flask 的时候会使用的上面说的 flask-wtf ,构建模型配合 jinja2 来形成表单,后来前后端分离的模式,使用 json,ajax 传数据,就用不到了。
用过 wtforms,对一些简单的类型校验还算友好,当然只检查 1 个 2 个变量代码量和手写差不多
错误提示就 raise,上层捕获
现在都在提前后端分离,所有 form、template 都很少在用了,都是 ajax + json 前后沟通了
以前用,后来只用 ajax

