📅  最后修改于: 2023-12-03 14:54:06.521000             🧑  作者: Mango
在 Django 中,DetailView 是一种常用的视图,用于展示某个对象的详情。我们可以通过 DetailView 来渲染一个模板,在该模板中展示该对象的详细信息。同时,也可以通过 DetailView 来接收表单数据,进行基本的处理和验证。
首先,我们需要在视图中创建一个继承自 DetailView 的类。该类需要指定以下属性:
例如,我们创建一个 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 模型的详细信息。