如何在 Django 的 DetailView 中获取来自另一个模型的表单?
How to have a Form from another Model inside a DetailView in Django?
我正在使用 Django,我想要做的是拥有一个帖子的详细视图,在该详细视图中,我想要一个带有帖子评论表单的评论部分。当我加载详细视图时,它没有显示我正在使用 Class Based Views 作为表单详细信息的 Comments 形式。
我的 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>
那是因为 DetailView
不处理 form_class
。您在这里有几个选择:
- 通过
get_context_data
提供表格
- 在
DetailView
上应用 FormMixin
。 (可以在django.view.generic.edit
下找到)
上下文数据示例:
def get_context_data(self, **kwargs):
context = super(PostDetailView, self).get_context_data(**kwargs)
context['comments_form'] = CommentsForm()
return context
我正在使用 Django,我想要做的是拥有一个帖子的详细视图,在该详细视图中,我想要一个带有帖子评论表单的评论部分。当我加载详细视图时,它没有显示我正在使用 Class Based Views 作为表单详细信息的 Comments 形式。 我的 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>
那是因为 DetailView
不处理 form_class
。您在这里有几个选择:
- 通过
get_context_data
提供表格
- 在
DetailView
上应用FormMixin
。 (可以在django.view.generic.edit
下找到)
上下文数据示例:
def get_context_data(self, **kwargs):
context = super(PostDetailView, self).get_context_data(**kwargs)
context['comments_form'] = CommentsForm()
return context