Django 表单与模板的集成
Django 表单是处理 HTML 表单数据的一种方式,它可以验证输入数据的合法性并将其保存到数据库中。同时,Django 的模板则是渲染 HTML 页面的一种方式,它可以将动态数据和静态内容结合起来呈现给用户。
为了将表单和模板集成起来,我们需要创建一个表单类,然后在视图函数中实例化该类并将其渲染到模板中。下面是一个简单的例子:
- 定义表单类
from django import forms class ContactForm(forms.Form): name = forms.CharField(max_length=50) email = forms.EmailField() message = forms.CharField(widget=forms.Textarea)
- 定义视图函数
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})
- 定义模板
{% 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 令牌,用于验证该表单是从网站的正确页面提交的。
代码演示:
- 定义表单类
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)
- 定义视图函数
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})
- 定义模板
{% 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 控件隐藏密码输入框。
相关文章