Django 表单与模板的集成

2023-04-11 00:00:00 模板 表单 集成

Django 表单是处理 HTML 表单数据的一种方式,它可以验证输入数据的合法性并将其保存到数据库中。同时,Django 的模板则是渲染 HTML 页面的一种方式,它可以将动态数据和静态内容结合起来呈现给用户。

为了将表单和模板集成起来,我们需要创建一个表单类,然后在视图函数中实例化该类并将其渲染到模板中。下面是一个简单的例子:

  1. 定义表单类
from django import forms

class ContactForm(forms.Form):
    name = forms.CharField(max_length=50)
    email = forms.EmailField()
    message = forms.CharField(widget=forms.Textarea)
  1. 定义视图函数
from django.shortcuts import render
from .forms import ContactForm

def contact(request):
    if request.method == 'POST':
        form = ContactForm(request.POST)
        if form.is_valid():
            # 处理表单数据
            name = form.cleaned_data['name']
            email = form.cleaned_data['email']
            message = form.cleaned_data['message']
            # 保存数据到数据库等
    else:
        form = ContactForm()
    return render(request, 'contact.html', {'form': form})
  1. 定义模板
{% extends 'base.html' %}

{% block content %}
    <h1>Contact</h1>
    <form method="post">
        {% csrf_token %}
        {{ form.as_p }}
        <button type="submit">Submit</button>
    </form>
{% endblock %}

在这个例子中,我们定义了一个 ContactForm 类,它包含了三个表单字段:name、email 和 message。在视图函数中,我们首先判断请求的方法是否为 POST,如果是,则实例化 ContactForm 并检查其数据的合法性,如果表单数据合法,则可以将其保存到数据库中。在模板中,我们使用 {{ form.as_p }} 渲染表单,它会按照表单字段的顺序将表单渲染成一个 HTML 表格。

需要注意的是,在模板中使用表单数据时,必须加上 {% csrf_token %} 保护 CSRF 攻击。该标签将为表单生成一个隐藏的 CSRF 令牌,用于验证该表单是从网站的正确页面提交的。

代码演示:

  1. 定义表单类
from django import forms

class RegisterForm(forms.Form):
    username = forms.CharField(max_length=50)
    email = forms.EmailField()
    password = forms.CharField(widget=forms.PasswordInput)
    confirm_password = forms.CharField(widget=forms.PasswordInput)
  1. 定义视图函数
from django.shortcuts import render
from .forms import RegisterForm

def register(request):
    if request.method == 'POST':
        form = RegisterForm(request.POST)
        if form.is_valid():
            # 处理表单数据
            username = form.cleaned_data['username']
            email = form.cleaned_data['email']
            password = form.cleaned_data['password']
            # 保存数据到数据库等
    else:
        form = RegisterForm()
    return render(request, 'register.html', {'form': form})
  1. 定义模板
{% extends 'base.html' %}

{% block content %}
    <h1>Register</h1>
    <form method="post">
        {% csrf_token %}
        {{ form.as_p }}
        <button type="submit">Submit</button>
    </form>
{% endblock %}

在这个例子中,我们定义了一个 RegisterForm 类,它包含了四个表单字段:username、email、password 和 confirm_password。在视图函数中,我们首先判断请求的方法是否为 POST,如果是,则实例化 RegisterForm 并检查其数据的合法性,如果表单数据合法,则可以将其保存到数据库中。在模板中,我们使用 {{ form.as_p }} 渲染表单,它会按照表单字段的顺序将表单渲染成一个 HTML 表格,并使用 PasswordInput 控件隐藏密码输入框。

相关文章