首页 > 解决方案 > 如何在 Django 的 DetailView 中拥有来自另一个模型的表单?

问题描述

我正在使用 Django,我想做的是有一个帖子的 DetailView,在那个详细视图中,我想要一个带有帖子评论表单的评论部分。当我加载详细视图时,它不会显示我正在使用基于类的视图作为表单详细信息的评论形式。我的 models.py 看起来像这样:

class Post(models.Model):
author = models.ForeignKey('auth.User', on_delete=models.CASCADE)
title = models.CharField(max_length = 200)
text = models.TextField()
created_date = models.DateTimeField(default = timezone.now)
likes = models.IntegerField(default=0)
tags = models.CharField(max_length = 50, default = '' )

def get_absolute_url(self):
    return reverse('blog:post_list')

def __str__(self):
    return self.title

class Comments(models.Model):
    post = models.ForeignKey('blog.Post', related_name='comments', on_delete=models.CASCADE)
    text = models.TextField()
    created_date = models.DateTimeField(default = timezone.now)

views.py 看起来像这样:

class PostDetailView(DetailView):
    form_class = CommentsForm
    model = Post

表格如下所示:

   class CommentsForm(forms.ModelForm):
        class Meta:
            model = Comments
            fields = ('text',)

            widgets = {
                'text' : forms.Textarea(attrs={'class':'comment-textarea'})
            }

comments_form.html 看起来像这样:

<div class="container">
    <div class="row">
        <div class="col">
            <h1>Estoy siendo insertado</h1>
            <form action="" method="POST">
                {%csrf_token%}
                {{ form.as_p }}
                <input type="submit" class="btn mt-2 btn-comments" value="Comment">
            </form>
        </div>
    </div>
</div>

标签: pythondjangodjango-formsdjango-class-based-views

解决方案


那是因为DetailView不处理form_class. 你有几个选择:

  • 通过提供表格get_context_data
  • 应用FormMixinDetailView. (可以在下面找到django.view.generic.edit

上下文数据示例:

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

推荐阅读