首页 > 解决方案 > 如何将第二个(不同的)模型实例发送到模板

问题描述

问题 - 我正在显示一个表单,允许用户添加关于现有帖子的评论。我还想在同一页面(渲染模板)上显示现有帖子(实例)。模板的模型是接受评论的模型(与帖子不同)。如何将帖子数据的模型实例传递给模板,以便我也可以显示帖子?

注意 - 我还需要 post 实例,因为为了将评论存储在数据库中,它需要链接到特定的 post id。

这可能很简单,但我遗漏了一些明显的东西——欢迎指出正确的文档。我只是在学习 Django,所以我还在学习我的方式。

细节:

我的模型如下(models.py):

class Post(models.Model):
    type = models.ForeignKey(
        PostType,
        on_delete=models.PROTECT,
        related_name='posts',
        default=1
    )
    title = models.CharField(max_length=100)
    body = models.TextField()
    author = models.ForeignKey(
        get_user_model(),
        on_delete=models.PROTECT,
        related_name='posts'
    )

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse('post_detail', args=[str(self.id)])

class Comment(models.Model):
    post = models.ForeignKey(
        Post,
        on_delete=models.CASCADE,
        related_name='comments',
    )
    body = models.TextField(max_length=1000)
    author = models.ForeignKey(
        get_user_model(),
        on_delete=models.PROTECT,
    )

    def __str__(self):
        return f'{self.body[:75]}...'

    def get_absolute_url(self):
        return reverse('post_detail', args=[str(self.post.id)])

我在 urls.py 中有我的 URL 路由:

urlpatterns = [
    path('post/<int:pk>/comment/new/', CommentCreateView.as_view(), name='comment_new'),
    path('post/new/', PostCreateView.as_view(), name='post_new'),
    path('post/<int:pk>/', PostDetailView.as_view(), name='post_detail'),
    ...
]

我有我的看法(views.py):

class CommentCreateView(LoginRequiredMixin, CreateView):
    model = Comment
    template_name = 'comment_new.html'
    fields = ['body']

    def form_valid(self, form):
        form.instance.author = self.request.user
        return super().form_valid(form)

最后是我的模板(comment_new.html):

    <div class="card post-entry">
        <span class="font-weight-bold">{{ post.title }}</span>
        <span class="m-3">&middot;</span>
        <span class="text-muted">{{ post.type }} by {{ post.author }} - {{ post.created|naturaltime }}</span>
        {{ post.body }}
    </div>

    <hr>
    <h2>New Comment</h2>
    <hr>

    <div class="post-entry-comment">
        <form action="" method="post">
            {% csrf_token %}
            {{ form|crispy }}
            <input class="btn btn-success" type="submit" value="Submit">
        </form>
    </div>

标签: djangodjango-viewsdjango-templates

解决方案


我在这里寻找 get_context_data 。这是一种将附加数据传递到基于类的模板的简单方法。


推荐阅读