📜  带有表单混合的 Detailview - BASIC (1)

📅  最后修改于: 2023-12-03 14:54:06.521000             🧑  作者: Mango

带有表单混合的 Detailview - BASIC

在 Django 中,DetailView 是一种常用的视图,用于展示某个对象的详情。我们可以通过 DetailView 来渲染一个模板,在该模板中展示该对象的详细信息。同时,也可以通过 DetailView 来接收表单数据,进行基本的处理和验证。

创建基本的 DetailView

首先,我们需要在视图中创建一个继承自 DetailView 的类。该类需要指定以下属性:

  • model:需要展示的模型。
  • template_name:渲染该模型详情的模板名称。
  • context_object_name:模型对象在模板中的变量名称。

例如,我们创建一个 Post 模型,并展示其详情:

# views.py

from django.views.generic.detail import DetailView
from .models import Post

class PostDetailView(DetailView):
    model = Post
    template_name = 'post_detail.html'
    context_object_name = 'post'

在上述代码中,我们定义了一个 PostDetailView 类,该类继承自 DetailView。我们指定了模型 Post、模板名称 post_detail.html 和变量名称 post。下一步,我们需要在模板中创建该模型的详情页面。

创建模板

我们可以在 templates 文件夹中创建一个名为 post_detail.html 的模板,该模板会在渲染 PostDetailView 时被使用。在该模板中,我们可以通过 {{ post }} 变量来获取 Post 模型对象。

<!-- post_detail.html -->

<h1>{{ post.title }}</h1>
<p>{{ post.content }}</p>

在上述代码中,我们可以通过 {{ post.title }}{{ post.content }} 来获取 Post 模型对象的 title 和 content 字段,并将其渲染到网页中。如果我们现在访问 /posts/1/,就可以看到 Post 模型在详情页面中的具体内容了。

添加表单处理和验证

通常情况下,我们不只是需要展示模型详情,还需要接收表单数据并进行一些处理和验证。我们可以在 DetailView 中添加表单处理的方法,方法名通常为 form_valid()。该方法用来处理表单数据,然后返回一个 HttpResponse。

例如,我们创建一个名为 Comment 的表单,它包含一个作者姓名和一段评论。我们可以在 Post 的详情页面中加入该表单,并处理提交的表单数据。

# views.py

from django.views.generic.edit import FormMixin
from .forms import CommentForm

class PostDetailView(FormMixin, DetailView):
    model = Post
    template_name = 'post_detail.html'
    context_object_name = 'post'
    form_class = CommentForm

    def get_success_url(self):
        return reverse('post_detail', kwargs={'pk': self.object.pk})

    def form_valid(self, form):
        self.object = self.get_object()
        form.instance.post = self.object
        form.save()
        return super(PostDetailView, self).form_valid(form)

    def get_context_data(self, **kwargs):
        context = super(PostDetailView, self).get_context_data(**kwargs)
        context['form'] = self.get_form()
        return context

在上述代码中,我们添加了 FormMixin,继承了表单相关的一些属性和方法。我们指定了表单的类 CommentForm,并在 get_success_url() 方法中设置成功提交表单后需要跳转到哪个页面。

form_valid() 方法用来处理表单,将表单数据与 Post 对象进行绑定并保存到数据库中。最后,我们调用了 super().form_valid(form) 方法来获取处理成功后的 HttpResponse 对象。

我们还重写了 get_context_data() 方法,在模板中添加表单对象 form

下一步,我们需要在模板中添加表单。我们可以通过 Django 的模板标签 {% csrf_token %} 来防止 CSRF 攻击,在表单中添加必要的字段和标签,并使用 JavaScript 代码来提交表单。

<!-- post_detail.html -->

<h1>{{ post.title }}</h1>
<p>{{ post.content }}</p>

<form method="post" action="{% url 'post_detail' post.pk %}">
  {% csrf_token %}
  {{ form.as_p }}
  <button type="submit">提交</button>
</form>

<script>
  $('form').submit(function(e) {
    $.post(this.action, $(this).serialize(), function(data) {
      $('form').html(data);
    });
    return false;
  });
</script>

在上述代码中,我们首先创建一个表单,然后使用 {% csrf_token %} 来防止 CSRF 攻击。接下来,我们使用 {{ form.as_p }} 将表单渲染成 HTML 代码。

在表单提交时,我们使用 JavaScript 代码来获取表单数据、提交表单并接收返回的数据。最后,我们将表单替换成返回的数据。

结论

在本文中,我们讲解了如何使用 DetailView 和 FormMixin 创建一个带有表单混合的视图。我们首先定义了模型 Post,然后创建了 PostDetailView 类,指定了需要展示的模型、渲染模板名称和变量名称。我们还通过重写 form_valid() 方法来处理提交的表单数据,并通过 {% csrf_token %} 和 JavaScript 代码来防止 CSRF 攻击和提交表单。最后,我们通过模板来展示 Post 模型的详细信息。

参考资料