Django 基于类的CreateView和UpdateView与多个内联表单集

Django 基于类的CreateView和UpdateView与多个内联表单集

在本文中,我们将介绍Django中使用基于类的CreateView和UpdateView与多个内联表单集的方法。CreateView和UpdateView是Django框架中基于类的视图,它们提供了快速而简单的方法来创建和更新数据对象。内联表单集是一种表单的组合,可以在一个表单中处理多个相关模型的数据。

阅读更多:Django 教程

什么是CreateView和UpdateView

CreateView和UpdateView是Django中的基于类的通用视图。它们是基于FormView视图的子类,专门用于处理创建和更新数据对象的视图。

CreateView

CreateView用于创建新的数据对象。它处理从表单中收集数据,并将其保存到数据库中。CreateView是一个用于渲染和处理表单的视图。通过继承CreateView并定义一些属性,我们可以轻松地创建一个用于创建新数据的视图。

from django.views.generic.edit import CreateView

class MyModelCreateView(CreateView):
    model = MyModel
    form_class = MyModelForm
    template_name = 'my_template.html'
    success_url = '/success-url/'
Python

在上面的示例中,我们创建了一个名为MyModelCreateView的视图,并指定了模型和表单类。template_name属性指定了用于呈现表单的模板路径,success_url属性指定了成功提交表单后要重定向的URL。

UpdateView

UpdateView用于更新现有的数据对象。与CreateView类似,它处理从表单中收集数据,并将其保存到数据库中。要使用UpdateView,我们需要为要更新的数据对象指定主键或其他唯一标识符。

from django.views.generic.edit import UpdateView

class MyModelUpdateView(UpdateView):
    model = MyModel
    form_class = MyModelForm
    template_name = 'my_template.html'
    success_url = '/success-url/'
Python

在上面的示例中,我们创建了一个名为MyModelUpdateView的视图,并指定了要更新的模型和表单类。template_name属性和success_url属性也被指定。

什么是内联表单集

内联表单集是一种表单的组合,用于同时处理多个相关模型的数据。在Django中,我们可以使用内联表单集来处理1对多或多对多关系。

使用内联表单集的CreateView

要在CreateView中使用内联表单集,我们需要为主模型和子模型创建相应的表单。然后,我们可以使用formset_factory函数来创建内联表单集,并将其作为上下文变量传递给模板。

from django.forms import formset_factory
from django.views.generic.edit import CreateView

class MyModelCreateView(CreateView):
    model = MyModel
    form_class = MyModelForm
    template_name = 'my_template.html'
    success_url = '/success-url/'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        MyInlineFormSet = formset_factory(MyInlineModelForm, extra=1)
        context['formset'] = MyInlineFormSet()
        return context
Python

在上面的示例中,我们通过重写get_context_data方法,并在上下文中传递创建的内联表单集,将内联表单集传递给模板。模板中可以通过简单地遍历表单集来渲染内联表单。

使用内联表单集的UpdateView

要在UpdateView中使用内联表单集,过程与CreateView类似。我们需要为主模型和子模型创建相应的表单,并将内联表单集传递给模板的上下文。

from django.forms import formset_factory
from django.views.generic.edit import UpdateView

class MyModelUpdateView(UpdateView):
    model = MyModel
    form_class = MyModelForm
    template_name = 'my_template.html'
    success_url = '/success-url/'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        MyInlineFormSet = formset_factory(MyInlineModelForm, extra=1)
        context['formset'] = MyInlineFormSet()
        return context
Python

在上面的示例中,我们通过重写get_context_data方法,并在上下文中传递创建的内联表单集,将内联表单集传递给模板。模板中可以通过简单地遍历表单集来渲染内联表单。

示例:使用CreateView和内联表单集创建博客和评论

让我们通过一个示例来演示在Django中使用CreateView和内联表单集创建博客和评论的流程。

首先,我们创建一个Blog模型和一个Comment模型,分别表示博客和评论。

from django.db import models

class Blog(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()

class Comment(models.Model):
    blog = models.ForeignKey(Blog, on_delete=models.CASCADE)
    content = models.CharField(max_length=200)
Python

接下来,我们为Blog和Comment模型创建相应的表单。

from django import forms

class BlogForm(forms.ModelForm):
    class Meta:
        model = Blog
        fields = ['title', 'content']

class CommentForm(forms.ModelForm):
    class Meta:
        model = Comment
        fields = ['content']
Python

然后,我们创建用于创建新博客和评论的视图,并使用内联表单集。

from django.forms import formset_factory
from django.views.generic.edit import CreateView

class BlogCreateView(CreateView):
    model = Blog
    form_class = BlogForm
    template_name = 'blog_create.html'
    success_url = '/success-url/'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        CommentFormSet = formset_factory(CommentForm, extra=1)
        context['formset'] = CommentFormSet()
        return context

    def form_valid(self, form):
        context = self.get_context_data()
        formset = context['formset']

        if formset.is_valid():
            self.object = form.save()
            for form in formset:
                comment = form.save(commit=False)
                comment.blog = self.object
                comment.save()
            return super().form_valid(form)
        else:
            return self.form_invalid(form)
Python

在上面的示例中,我们创建了BlogCreateView视图,并定义了BlogForm和CommentForm作为主表单和内联表单。在视图的get_context_data方法中,我们创建了CommentFormSet并将其添加到上下文中。

在form_valid方法中,我们首先保存主表单(博客)的数据并将其赋给self.object。然后,我们遍历内联表单集中的每个表单,将博客对象与评论对象关联并保存。

最后,我们可以在模板中使用以下方式渲染主表单和内联表单。

<!-- blog_create.html -->
<form method="post">
    {% csrf_token %}
    {{ form.as_p }}

    {% for form in formset %}
        {{ form.as_table }}
    {% endfor %}

    <button type="submit">Submit</button>
</form>
HTML

总结

在本文中,我们介绍了Django中使用基于类的CreateView和UpdateView与多个内联表单集的方法。CreateView和UpdateView是Django中的通用视图,用于创建和更新数据对象。内联表单集是一种组合表单,可以同时处理多个相关模型的数据。通过了解和运用这些概念,我们可以更有效地开发Django应用程序并管理复杂的数据关系。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

登录

注册