【问题标题】:Pointing Django comments to specific objects将 Django 注释指向特定对象
【发布时间】:2023-03-13 05:29:01
【问题描述】:

我无法将特定 cmets 指向我的 Django 网站中的特定对象。在下面的 HTML 页面上,显示了 5 个posts 及其各自的属性。每个post 都有自己的comment_form,用户可以在其中留下cmets。然而,当留下评论时,所有帖子都共享相同的 cmets,而不是他们自己独特的 cmets 集。有没有人推荐我给每个post 提供他们自己独特的comments 集合,这样他们就不会共享同一个?

这是我当前的 HTML:

    <div class="mainContent">
    <div class="content">
    {% for post in posts %}
        <article class="topContent">
            <div>
                <h1>{{ post.title }}</h1>
                <p>{{ post.body }}</p>
                <h6><i>published  {{ post.pub_date }}</i></h6>
                    <div class="commentForm">
                        {% for comment in comments %}
                        <p id="commentP">{{ comment.comment }} - {{ comment.name }}</p>
                        {% endfor %}
                    </div>
                <form method="POST" action="">
                {% csrf_token %}
                <div id='comment_form'>
                    <div id="namePrompt">
                        <p> Name:</p>
                    </div>
                    <div id="formName"> 
                        {{form.name}}
                    </div>
                    <div id="commentPrompt">
                        <p> Comment: </p>
                    <div id="formComment">
                        {{form.comment}} 
                    </div>
                    <div id="submitBtn">
                        <input type='submit' name='submit' value='Add Comment'>
                    </div>
                </div>
            </form>
            </div>
        </article>
        {% endfor %}
    </div>
</div>

这里是视图:

def projects(request):

    print request
    posts = ProjectsPost.objects.all()
    comment_from_db = ProjectComment.objects.all()
    form = ProjectCommentForm(request.POST or None)

    if form.is_valid():
        new_form = form.save(commit=False)
        name = form.cleaned_data['name']
        comment = form.cleaned_data['comment']
        context_comment = ProjectComment.objects.get_or_create(name=name, comment=comment)
        print context_comment

    template = "blog/projects.html"
    context = {"form":form}
    project_posts = {'posts':posts}

    return render(request, template, {'form':form, 'posts':posts, 'comments':comment_from_db})`

【问题讨论】:

  • 我能不能创建一个 Comment() 模型并使用 ForeignKey 将其绑定到 ProjectPost() 的主键 (pk),然后使用 Comment() 作为 ProjectCommentForm() 的 Meta 类,以及通过我的views.py渲染它?或者如果这不起作用,是否有更有效的方法?

标签: python django


【解决方案1】:

我假设您的模型如下所示:

class ProjectPosts(models.Model):
    .... 

class ProjectComments(models.Model):
    ....
    post = models.ForeignKey(ProjectPosts)

然后在你的模板中,你需要这样做:

    <div class="commentForm">
        {% for comment in post.projectcomments_set.all %}
        <p id="commentP">{{ comment.comment }} - {{ comment.name }}</p>
        {% endfor %}
    </div>

是的。您可以像在模板中那样迭代反向 FK 关系。

编辑:我现在看到您正在查看所有 cmets,这也不适用于特定帖子。你不需要这样做。每当您需要为特定帖子显示 cmets 时,请在您的模板中执行我上面显示的操作。

【讨论】:

  • 我明白了,这完全有道理。甚至不需要通过很棒的视图来渲染它们!谢谢大家的帮助
【解决方案2】:

如果帖子与其相关评论之间没有关联,那么每次查询数据库时,您都会获取所有 cmets 并将其传递给模板。

正如您在自己的评论中提到的,在 Comment 模型上添加外键应该可以工作。因此,当您查询特定文章的 cmets 时,您应该只能查询与该文章相关的 cmets。

所以本质上是这样的:

class ProjectPosts(models.Model):
    .... 

class ProjectComments(models.Model):
    ....
    post = models.ForeignKey(ProjectPosts)

当检索与帖子相关的所有 cmets 时,您可以执行以下操作:

post_comment = PorjectPosts.projectcomments_set.filter(id=foo)

您可以在Django ORM here 中阅读更多关于关系的信息。

【讨论】:

    猜你喜欢
    • 2012-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-23
    • 2011-08-04
    • 2016-11-07
    • 1970-01-01
    相关资源
    最近更新 更多