Django中formsets.DELETION_FIELD_NAME参数的作用与功能如何
在Django中,formsets.DELETION_FIELD_NAME参数用于标记是否要删除已存在的表单数据。它可以在表单集(formset)中的每个表单前面添加一个复选框,当选中此复选框时,表示要删除该表单的数据。
以下是一个使用formsets.DELETION_FIELD_NAME参数的例子:
首先,我们需要创建一个简单的模型,然后定义一个与该模型相关联的表单类。在这个例子中,我们创建一个简单的模型用于存储书籍的信息:
from django.db import models
class Book(models.Model):
title = models.CharField(max_length=100)
author = models.CharField(max_length=100)
接下来,我们定义一个与该模型相关联的表单类BookForm:
from django import forms
from .models import Book
class BookForm(forms.ModelForm):
class Meta:
model = Book
fields = ['title', 'author']
现在,我们将使用表单集(formset)来处理多个表单的数据。
首先,我们需要导入表单集(formset)的相关模块和Django的视图模块:
from django.forms import formset_factory from django.shortcuts import render from .forms import BookForm
然后,我们定义一个视图函数来处理表单集(formset):
def add_books(request):
BookFormSet = formset_factory(BookForm, extra=2, can_delete=True)
if request.method == 'POST':
formset = BookFormSet(request.POST, prefix='book')
if formset.is_valid():
for form in formset:
if form.cleaned_data.get('DELETE'):
# 删除已存在的表单数据
book_id = form.cleaned_data.get('id')
Book.objects.get(id=book_id).delete()
else:
# 保存表单数据
form.save()
return HttpResponse('Books added successfully!')
else:
formset = BookFormSet(prefix='book')
return render(request, 'add_books.html', {'formset': formset})
在这个示例中,我们使用formset_factory函数创建了一个名为BookFormSet的表单集(formset),参数extra用于指定要显示的初始表单数量,参数can_delete用于表示是否允许表单被删除。
当请求为POST方法时,我们首先创建一个表单集(formset)实例,然后使用is_valid()方法验证表单数据的有效性。如果表单数据无效,视图函数将重新渲染表单,并将错误信息传递给前端。如果表单数据有效,我们将遍历表单集(formset)中的每一个表单,如果表单的DELETE字段为True,则表示要删除该表单的数据,我们获取该表单对应的模型实例并进行删除操作;否则,我们保存表单的数据。最后,我们返回一个成功的HTTP响应。
当请求为GET方法时,视图函数将简单地渲染表单集(formset)并传递给前端。
最后,我们需要定义一个HTML模板文件add_books.html来渲染表单集(formset):
<!DOCTYPE html>
<html>
<head>
<title>Add Books</title>
</head>
<body>
<form method="post">
{% csrf_token %}
{{ formset.management_form }}
{% for form in formset %}
{{ form.DELETE }}
{{ form.title }}
{{ form.author }}
<br>
{% endfor %}
<input type="submit" value="Add Books">
</form>
</body>
</html>
在模板中,我们首先使用{{ formset.management_form }}渲染了表单集(formset)中的管理表单,然后我们使用{{ form.DELETE }}在每个表单前面添加了一个复选框,{{ form.title }}和{{ form.author }}用于显示每个表单的标题和作者字段。最后,我们定义了一个提交按钮。
通过上述代码,我们实现了一个带有formsets.DELETION_FIELD_NAME参数的表单集(formset)的例子,并且可以在表单前面添加一个复选框来删除表单的数据。
