Django 动态删除 Django 中的行内表单集

Django 动态删除 Django 中的行内表单集

在本文中,我们将介绍如何在Django中动态删除行内表单集。行内表单集是一种用于处理父子关系模型的表单。通常,我们可以在父模型的表单中一起添加、编辑和删除多个子模型的记录。在某些情况下,我们可能需要动态删除行内表单集中的特定子模型记录,而不是删除整个表单集。

阅读更多:Django 教程

创建父子模型

首先,让我们创建一个示例的父子模型。假设我们有两个模型:Author(作者)和Book(书籍),它们之间是一对多的关系。每个作者都可以有多本书。以下是模型的定义:

from django.db import models

class Author(models.Model):
    name = models.CharField(max_length=100)
    email = models.EmailField()

class Book(models.Model):
    title = models.CharField(max_length=100)
    author = models.ForeignKey(Author, on_delete=models.CASCADE)
    description = models.TextField()
Python

创建父子表单

接下来,我们需要创建能够处理父子关系模型的表单。在Django中,我们可以使用inlineformset_factory函数来创建行内表单集。

from django import forms
from django.forms import inlineformset_factory
from .models import Author, Book

AuthorFormSet = inlineformset_factory(Author, Book, fields=('title', 'description'), extra=1)
Python

在上面的代码中,我们使用inlineformset_factory函数创建了一个AuthorFormSet类,该类将显示每本书的标题和描述字段,并提供一个额外的空表单用于添加新的书籍记录。

接下来,我们需要在视图中使用这个表单集来处理数据。

from django.shortcuts import render, redirect
from .forms import AuthorFormSet

def create_author(request):
    formset = AuthorFormSet()
    if request.method == 'POST':
        formset = AuthorFormSet(request.POST)
        if formset.is_valid():
            formset.save()
            return redirect('author_list')
    return render(request, 'create_author.html', {'formset': formset})
Python

在上面的代码中,我们创建了一个名为create_author的视图函数,它使用AuthorFormSet类创建一个空的表单集实例。当用户提交表单时,我们将检查表单集是否有效,并保存数据。最后,我们将重定向到作者列表页面。

动态删除行内表单集

现在,我们将介绍如何在Django中动态删除行内表单集中的子模型记录。为了实现这一点,我们将在模板中使用JavaScript来处理删除操作。

首先,我们需要在模板中添加一个删除按钮来触发删除操作。我们可以使用{{ form.DELETE }}来渲染一个复选框,以便用户选择要删除的书籍。

<form method="post">
    {{ formset.management_form }}
    {% for form in formset %}
        {{ form }}
        {{ form.DELETE }}
    {% endfor %}
    <input type="submit" value="Save">
</form>
HTML

上面的代码中,{{ form.DELETE }}将渲染一个复选框,用于选择要删除的表单。

接下来,我们需要在模板中添加一些JavaScript代码来处理删除操作。

<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script>
    (document).ready(function () {('.delete-row').click(function () {
            (this).prev().prop('checked', true);(this).closest('.form-row').hide();
        });
    });
</script>
JavaScript

上面的代码中,我们使用jQuery绑定了一个点击事件,当用户点击删除按钮时,我们将选择前面的复选框(表单的DELETE字段),并将其属性设置为true。然后,我们找到最近的父元素form-row并将其隐藏。

总结

在本文中,我们介绍了如何在Django中动态删除行内表单集中的子模型记录。我们创建了一个父子模型示例,并使用inlineformset_factory函数创建了一个能够处理父子关系模型的表单集。然后,我们在视图中使用表单集来处理数据,并使用JavaScript来动态删除表单集中的子模型记录。希望本文能帮助你更好地理解和应用Django的行内表单集功能。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

登录

注册