【问题标题】:How to create a comment-creation page related to a single blog-style post in Django如何在 Django 中创建与单个博客样式帖子相关的评论创建页面
【发布时间】:2020-06-16 20:35:00
【问题描述】:

我正在尝试使用 Django 创建与博客风格网站上的单个帖子相关的评论创建页面。

主页有一个帖子列表,每个帖子都有一个“评论”按钮。理想情况下,这个“评论”按钮会将您带到一个页面,该页面的顶部列出了原始帖子,下方是评论创建表单。

我一直在尝试找出一种方法来使用主键访问我正在寻找的数据,但不知道如何将所有内容联系在一起。

这是我尝试访问的 2 个模型(PostComment):

class Post(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, null=True)
    title = models.CharField(max_length=128)
    content = models.TextField()
    image = models.ImageField(upload_to='post_pics', blank=True)
    date_posted = models.DateTimeField(default=timezone.now)

    def get_absolute_url(self):
        return reverse('home')

class Comment(models.Model):
    post = models.ForeignKey(Post, on_delete=models.CASCADE, related_name='comments')
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    comment = models.TextField()
    date_created = models.DateTimeField(default=timezone.now)

还有urls.py

from django.urls import path
from .views import PostCreateView, PostListView, VehicleListView, CommentCreateView
from . import views

urlpatterns = [
    path('', PostListView.as_view(), name='home'),
    path('comment/new/<int:pk>', CommentCreateView.as_view(), name='comment-create'),
]

这是我当前的主页 HTML(目前在链接的“评论创建”页面上的 HTML 末尾添加了帖子 ID):

{% for post in posts %}
    <div class="infinite-item">
      <div class="card m-3">
        <div class="card-body" style="background-color:#bdcade; padding-bottom:0px">
          <div class="media mb-3">
            <img src="{{ user.profile.image.url }}" class="d-block ui-w-40 rounded-circle" style="width:40px;height:auto;" alt="">
            <div class="media-body ml-3">
              <h5 style="color:#ffffff">{{ post.user.username }}</h5>
              <div class="small text-muted">Yesterday</div>
            </div>
          </div>
        </div>

        <div class="card-body">
          <h5 class="card-title">{{ post.title }}</h5>
          <p class="card-text">{{ post.content }}</p>
          <div class="btn-group" role="group">
            <button type="button" class="btn btn-secondary">Like</button>
            <a class="btn btn-secondary" href="{% url 'comment-create' post.id %}" role="button">Comment</a>

          </div>
        </div>
      </div>
    </div>

这是我当前用于评论创建页面的 HTML:

{% block content %}

  <div class="card m-3">
    <div class="card-body" style="background-color:#bdcade; padding-bottom:0px">
      <div class="media mb-3">
        <img src="{{ post.user.profile.image.url }}" class="d-block ui-w-40 rounded-circle" style="width:40px;height:auto;" alt="">
        <div class="media-body ml-3">
          <h5 style="color:#ffffff">{{ post.user.username }}</h5>
          <div class="small text-muted">{{ post.title }}</div>
        </div>
      </div>
    </div>

    <div class="card-body">
      <h5 class="card-title">{{ post.title }}</h5>
      <p class="card-text">{{ post.content }}</p>
      <div class="btn-group" role="group">
        <button type="button" class="btn btn-secondary">Like</button>
        <button type="button" class="btn btn-secondary">Comment</button>
      </div>
    </div>
  </div>

  <br>
  <div class="container primary-segments">
    <form method="POST" enctype="multipart/form-data">
      {% csrf_token %}
      <fieldset>
        {{ form|crispy }}
      </fieldset>
      <div class="form-group">
        <button class="btn btn-outline-info" type="submit">Post Comment</button>
      </div>
    </form>
  </div>

{% endblock content %}

这是评论创建页面的视图(使用get_context_data访问Post模型):

class CommentCreateView(LoginRequiredMixin, CreateView):
    model = Comment
    template_name = 'home/comment-form.html'
    fields = ['comment',]

    def get_context_data(self, **kwargs):
        context = super(CommentCreateView, self).get_context_data(**kwargs)
        pk = self.kwargs['pk']
        context['post'] = Post.objects.filter(id=pk)
        return context

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

目前,我无法访问评论创建页面中帖子的任何数据。我认为这与我如何尝试在 -get_context_data` 函数中将 pkpost 联系起来有关。所需帖子的主键显示在 URL 中,只是不确定如何获取正确的数据。

任何帮助将不胜感激。谢谢!

【问题讨论】:

    标签: python html django django-views


    【解决方案1】:

    所以在我看来你在这里使用了pk 错误。

    这里代码段中的pk

    def get_context_data(self, **kwargs):
            context = super(CommentCreateView, self).get_context_data(**kwargs)
            pk = self.kwargs['pk']
    

    commentpk,但是您正尝试使用它来查找Postcontext['post'] = Post.objects.filter(id=pk)。请记住,pk 代表primary key,并引用您声明为视图的model 的对象。如果您想要与 Comment 关联的 Post,则需要使用 Comment.post 搜索它,因为这是模型中声明的外键。

    【讨论】:

    • 嗯,有道理。你认为我仍然可以使用Comment.post 访问数据吗,因为我将使用Comment 模型的尚未保存的实例(即我将填写信息以获取关于评论创建页面)?
    • @tsmith41094 您至少应该有某种访问方式。 IIRC self.object 引用了正在创建的对象,并且应该包含您需要的 post.id 值。
    【解决方案2】:

    经过大量的谷歌搜索/反复试验,我找到了一个解决方案,让我得到了我正在寻找的东西。

    从 THIS 更新了我的 View(注意:我试图强制一个特定的 PK 测试它是否会过滤到正确的数据,但由于某种原因我仍然无法访问任何东西):

    class CommentCreateView(LoginRequiredMixin, CreateView):
        model = Comment
        template_name = 'home/comment-form.html'
        fields = ['comment',]
    
        def get_context_data(self, **kwargs):
            context = super(CommentCreateView, self).get_context_data(**kwargs)
            pk = 7
            context['post'] = Post.objects.filter(id=pk)
            return context
    
        def form_valid(self, form):
            form.instance.user = self.request.user
            return super().form_valid(form)
    

    到这里:

    class CommentCreateView(LoginRequiredMixin, CreateView):
        model = Comment
        template_name = 'home/comment-form.html'
        fields = ['comment',]
    
        def get_context_data(self, **kwargs):
            context = super(CommentCreateView, self).get_context_data(**kwargs)
            context['post'] = Post.objects.get(pk=self.kwargs['pk'])
            return context
    
        def form_valid(self, form):
            form.instance.user = self.request.user
            return super().form_valid(form)
    
    

    对它的作用有一个基本的、高层次的理解(从 URL 中获取 PK),但我不完全确定为什么原来的 .filter() 方法不起作用。

    如果有人可以提供一些关于这里幕后发生的事情的背景信息,我很乐意看到它。

    谢谢!

    【讨论】:

      猜你喜欢
      • 2015-04-20
      • 1970-01-01
      • 2016-07-26
      • 1970-01-01
      • 2020-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-02
      相关资源
      最近更新 更多