Python中Django或Flask等Web框架如何使用form表单模型?

使用 django 开发快两年了,开发过程中没有用过表单模型这东西,貌似也没有见周围人有用过。
大家开发过程中会在后台写表单模型吗?
Python中Django或Flask等Web框架如何使用form表单模型?

9 回复

我不用。
主要是错误提示不好弄。


在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

回到顶部