跳转至

Django表单

在 Django 中,表单处理是 Web 开发的一个重要组成部分。Django 提供了一个强大的表单框架来简化表单的创建、验证和处理。通过 Django 表单框架,你可以轻松地生成 HTML 表单、验证用户输入并处理提交的数据。

创建表单

创建一个简单的表单类

表单类继承自 django.forms.Form,可以包含各种字段(例如文本字段、电子邮件字段、日期字段等)。每个字段都可以有验证规则。

# forms.py

from django import forms

class ContactForm(forms.Form):
    name = forms.CharField(label='Your name', max_length=100)
    email = forms.EmailField(label='Your email')
    message = forms.CharField(widget=forms.Textarea, label='Your message')

使用表单

在视图中使用表单

在视图中,我们可以实例化表单对象,处理表单提交并进行验证。

# views.py

from django.shortcuts import render
from .forms import ContactForm

def contact_view(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']
            # 可以在这里处理表单数据,例如保存到数据库或发送电子邮件
            return render(request, 'thanks.html', {'name': name})
    else:
        form = ContactForm()

    return render(request, 'contact.html', {'form': form})

在模板中渲染表单

Django 提供了一些模板标签和过滤器,可以方便地渲染表单。

<!-- contact.html -->

<!DOCTYPE html>
<html>
<head>
    <title>Contact Us</title>
</head>
<body>
    <h1>Contact Us</h1>
    <form method="post">
        {% csrf_token %}
        {{ form.as_p }}
        <button type="submit">Submit</button>
    </form>
</body>
</html>

表单验证

Django 表单框架自动处理大多数的验证逻辑。例如,EmailField 会自动验证输入的内容是否为有效的电子邮件地址。

你也可以定义自定义验证逻辑:

# forms.py

from django import forms

class ContactForm(forms.Form):
    name = forms.CharField(label='Your name', max_length=100)
    email = forms.EmailField(label='Your email')
    message = forms.CharField(widget=forms.Textarea, label='Your message')

    def clean_name(self):
        name = self.cleaned_data['name']
        if "spam" in name:
            raise forms.ValidationError("Invalid name - contains forbidden word")
        return name

模型表单

Django 还提供了 ModelForm 类,可以根据模型自动生成表单。这样可以避免重复定义模型和表单字段。

创建模型表单

假设我们有一个 Contact 模型:

# models.py

from django.db import models

class Contact(models.Model):
    name = models.CharField(max_length=100)
    email = models.EmailField()
    message = models.TextField()

    def __str__(self):
        return self.name

我们可以创建一个模型表单来自动生成表单字段:

# forms.py

from django import forms
from .models import Contact

class ContactForm(forms.ModelForm):
    class Meta:
        model = Contact
        fields = ['name', 'email', 'message']

在视图中使用模型表单

# views.py

from django.shortcuts import render
from .forms import ContactForm

def contact_view(request):
    if request.method == 'POST':
        form = ContactForm(request.POST)
        if form.is_valid():
            form.save()  # 将表单数据保存到数据库
            return render(request, 'thanks.html', {'name': form.cleaned_data['name']})
    else:
        form = ContactForm()

    return render(request, 'contact.html', {'form': form})

自定义表单小部件

你可以自定义表单小部件,以改变字段的显示方式。例如,改变输入框的 CSS 类:

# forms.py

from django import forms
from .models import Contact

class ContactForm(forms.ModelForm):
    class Meta:
        model = Contact
        fields = ['name', 'email', 'message']
        widgets = {
            'name': forms.TextInput(attrs={'class': 'form-control'}),
            'email': forms.EmailInput(attrs={'class': 'form-control'}),
            'message': forms.Textarea(attrs={'class': 'form-control'}),
        }

处理文件上传

处理文件上传需要在表单中使用 FileFieldImageField,并在视图中处理文件数据。

创建文件上传表单

# forms.py

from django import forms

class UploadFileForm(forms.Form):
    title = forms.CharField(max_length=50)
    file = forms.FileField()

在视图中处理文件上传

# views.py

from django.shortcuts import render
from django.http import HttpResponseRedirect
from .forms import UploadFileForm

def upload_file_view(request):
    if request.method == 'POST':
        form = UploadFileForm(request.POST, request.FILES)
        if form.is_valid():
            handle_uploaded_file(request.FILES['file'])
            return HttpResponseRedirect('/success/url/')
    else:
        form = UploadFileForm()
    return render(request, 'upload.html', {'form': form})

def handle_uploaded_file(f):
    with open('some/file/name.txt', 'wb+') as destination:
        for chunk in f.chunks():
            destination.write(chunk)

在模板中渲染文件上传表单

<!-- upload.html -->

<!DOCTYPE html>
<html>
<head>
    <title>Upload File</title>
</head>
<body>
    <h1>Upload File</h1>
    <form method="post" enctype="multipart/form-data">
        {% csrf_token %}
        {{ form.as_p }}
        <button type="submit">Upload</button>
    </form>
</body>
</html>

总结

Django 的表单框架提供了强大且灵活的工具来处理表单,包括创建、验证和处理表单数据。通过使用 Django 表单,可以减少重复代码,并且更容易地管理和处理用户输入的数据。

评论