【问题标题】:How to display a selected post on a comments form如何在评论表单上显示选定的帖子
【发布时间】:2020-07-18 02:27:24
【问题描述】:

我正在开展一个项目,用户可以在该项目中发布视频并评论其他人的视频,例如 instagram。

cmets 页面有 3 个部分,一个上传评论的表单,一个显示 cmets 的表单。

最后是用户选择评论的视频(未显示)。

models.py

class Comment(models.Model):
    post = models.ForeignKey(Post, on_delete=models.CASCADE)
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    content = models.TextField(max_length=160)
    timestamp = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return '{}-{}'.format(self.post.title, str(self.user.username))

class Post(models.Model):
    text = models.CharField(max_length=200)
    video = models.FileField(upload_to='clips', null=True, blank=True)
    user = models.ForeignKey(User, related_name='imageuser', on_delete=models.CASCADE, default='username')
    liked = models.ManyToManyField(User, default=None, blank=True, related_name='liked')
    updated = models.DateTimeField(auto_now=True)
    created =models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return str(self.text)

    def get_absolute_url(self):
        return reverse('comments', args=[self.pk])

views.py

def comments(request, pk):
    post = get_object_or_404(Post, pk=pk)
    comments = Comment.objects.filter(post=post)
    if request.method == 'POST':
        comment_form = CommentForm(request.POST or None)
        if comment_form.is_valid():
            content = request.POST.get('content')
            comment = Comment.objects.create(post=post, user=request.user, content=content)
            comment.save()
            return HttpResponseRedirect(post.get_absolute_url())

    else:
        comment_form = CommentForm()
    context2 = {
        "comments": comments,
        "comment_form": comment_form,

    }
    return render(request, 'comments.html', context2)

cmets.html

<div class="post-container">
  <video class="video" width='400'>
    <source src='{{ video.url }}' type='video/mp4'>
  </video>
</div>
<div class="comment-container">
  <form method="post">
    {% csrf_token %}
    {{comment_form.as_p}}
    {% if request.user.is_authenticated %}
      <input type="submit" value="Submit">
    {% else %}
      <input type="submit" value="Submit"disabled>
    {% endif %}
  </form>
  <div class="main-comment-section">
    {{ comments.count }}
    {% for comment in comments %}
      <blockquote class="blockquote">
        <p class="mb-0">{{ comment.content }}</p>
        <footer class="blockquote-footer">by <cite title="Source Title">{{ comment.user }}</cite></footer>
      </blockquote>
    {% endfor %}
  </div>
</div>

有任何问题请告诉我;)

【问题讨论】:

    标签: python django django-models django-forms django-views


    【解决方案1】:

    您可以将其添加到上下文字典 "post": post 并从上下文中删除 "comments": comments,

    然后在您的模板中,您可以循环遍历 cmets 之类的

    {% for comment in post.comment_set.all %}
      <blockquote class="blockquote">
        <p class="mb-0">{{ comment.content }}</p>
        <footer class="blockquote-footer">by <cite title="Source Title">{{ comment.user }}</cite></footer>
      </blockquote>
    {% endfor %}
    

    然后为视频做

    <video class="video" width='400'>
      <source src='{{ post.video.url }}' type='video/mp4'>
    </video>
    

    此外,当您使用Comment.objects.create() 方法时,无需调用comment.save()create() 方法调用save()

    【讨论】:

      【解决方案2】:

      原因是视频是媒体文件(如文件字段、图像等),您已经添加了为媒体字段添加的所有内容,即 MEDIA_URL、MEDIA_ROOT、url 和加密 确保您已维护媒体文件设置。在您的 settings.py 文件中:

      MEDIA_ROOT= os.path.join(os.path.dirname(BASE_DIR), "media/")```
      Then in your main urls.py:
      
      ```urlpatterns = patterns('',
          # ... the rest of your URLconf goes here ... ) + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
      

      还要确保在模板的表单标签中添加enctype="multipart/form-data

      更多信息,请查看https://docs.djangoproject.com/en/3.0/topics/http/file-uploads/

      【讨论】:

        猜你喜欢
        • 2017-02-11
        • 2019-12-07
        • 2018-10-21
        • 1970-01-01
        • 1970-01-01
        • 2019-04-12
        • 1970-01-01
        • 2020-01-25
        • 1970-01-01
        相关资源
        最近更新 更多