【问题标题】:how can i display comments below the respective post in the home page如何在主页中的相应帖子下方显示评论
【发布时间】:2018-07-08 07:48:10
【问题描述】:

我想实现类似 fb 的功能,喜欢在主页的相应帖子下方显示所有相应的 cmets
model.py

from django.db import models
from django.contrib.auth.models import User


class Post(models.Model):
    post = models.CharField(max_length=500)
    image = models.ImageField(upload_to = 'profile_image')
    user = models.ForeignKey(User ,on_delete = 'models.CASCADE')
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.post

class Comment(models.Model):
    user = models.ForeignKey(User,on_delete = 'models.CASCADE')
    post = models.ForeignKey(Post, null = True, on_delete = 'models.CASCADE')
    comment = models.TextField()
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.comment  

views.py

from django.views.generic import TemplateView
from django.shortcuts import render, redirect,get_object_or_404
from django.contrib.auth.models import User
from home.forms import HomeForm,Home,CommentForm
from home.models import Post ,ImagePost,Comment


class HomeView(TemplateView):
    template_name = 'home/home.html'

    def get(self, request):
        form = HomeForm()
        form1 = CommentForm()
        posts = Post.objects.filter(user = request.user).order_by('-created')
        comments = Comment.objects.all()
        users = User.objects.exclude(id=request.user.id)
        args = {
            'form': form, 'posts': posts, 'users': users, 'form1':form1,
            'comments':comments,
        }
        return render(request, self.template_name, args)

    def post(self, request):
        form1 = CommentForm()
        text = ''
        if request.method == 'POST':
            form = HomeForm(request.POST,request.FILES)
            if form.is_valid():

                post = form.save(commit=False)
                post.user = request.user
                post.save()
                text = form.cleaned_data['post']
                form = HomeForm()
                form1 = CommentForm()
                return redirect('home:home')
    def cmnt(self , request):
        text = ''
        form1 = CommentForm()
        if request.method == 'POST':
            form1 = CommentForm(request.POST,post.id)
            if form.is_valid():
                comment = form.save(commit = False)
                comment.user = request.user
                comment.post = request.post
                comment.save()
                text = form.cleaned_data['comment']
                form1 = CommentForm()
                form = HomeForm()
                return redirect('home:home')

            args = {'form': form, 'text': text , 'form1':form1}
            return render(request, self.template_name, args)

home.html

{% extends 'base.html' %}
{%  load static %}

{% block body %} 
<div class="container">
    <div class="col-md-8">
        <h2>Home</h2>
        <form  method="POST" enctype="multipart/form-data" type = 'file'>
            {% csrf_token %}
            {{ form.post }}
            {{ form.image }}
            <br>
            <button type="submit">Submit</button>
        </form>
        <h2>{{ text }}</h2>
        {% for post in posts %}
            <h1>{{ post.post }}</h1>
            <br>
            <img src="{{ post.image.url }}" width = 240 >
            <p>Posted by {{ post.user.get_full_name }} on {{ post.created }}</p>
        <form  method="POST" enctype="multipart/form-data" type = 'file'>
            {% csrf_token %}
            {{ form1.comment }}
            <br>
            <button type="submit">Submit</button>
        </form>

            {% for comment in comments %}
            {% if comment.post_id == post.id %}
            <h1>{{ comment.comment }}</h1>
            <p>commented by {{ comment.user.get_full_name }} on {{ comment.created }}</p>
            {% endif %}
            {% endfor %}
        {% endfor %}

    </div>

</div>
{% endblock %}  

using my django admin i am able to assign comments to the respective post and display it

我发现很难将评论的 post_id 分配给帖子 ID

urls.py

from django.conf.urls import url 
from django.urls import path
from .import views
from home.views import HomeView


app_name = "home"
urlpatterns = [
     path('',HomeView.as_view(), name='home'),
     ]

【问题讨论】:

    标签: django django-models django-comments


    【解决方案1】:

    首先,像这样改变评论模型:

    class Comment(models.Model):
        user = models.ForeignKey(User,on_delete = 'models.CASCADE')
        post = models.ForeignKey(Post, null = True, on_delete = 'models.CASCADE')
        text = models.TextField()
        created = models.DateTimeField(auto_now_add=True)
        updated = models.DateTimeField(auto_now=True)
    
        def __str__(self):
            return self.text
    

    其次,您不需要返回模板的评论列表。在你的模板中这样做:

    {% extends 'base.html' %}
    {%  load static %}
    
    {% block body %} 
    <div class="container">
        <div class="col-md-8">
    
            <h2>{{ text }}</h2>
            {% for post in posts %}
               <h1>{{ post.post }}</h1>
               <br>
               <img src="{{ post.image.url }}" width = 240 >
               <p>Posted by {{ post.user.get_full_name }} on {{ post.created }}</p>
    
                {% for comment in post.comment_set.all %}
    
                    <h1>{{ comment.text }}</h1>
                    <p>commented by {{ comment.user.get_full_name }} on {{ comment.created }}</p>            
               {% endfor %}
            {% endfor %}
    
    </div>
    

    【讨论】:

    • 通过进行更改,我可以显示 cmets,但是,我希望登录的用户添加 cmets,因为我做了一个评论表单(你可以在 home.html 中看到它 form1 是评论表单)@ 987654321@我得到这个错误
    • 如果我的答案是正确的,请检查一下并将这个问题放在另一个帖子中,以便其他人可以使用它。
    【解决方案2】:

    我认为你的问题在这里

    form1 = CommentForm(request.POST,Post.id)
    

    post中的p应该是小写

    form1 = CommentForm(request.POST,post.id)
    

    您有两个 POST 表单。为每个帖子写单独的视图。您只在一个视图中接受这两种形式。这是不正确的。

    【讨论】:

    • 在编辑了我的 views.py link 我得到这个错误
    【解决方案3】:
    def post(self, request):
        form1 = CommentForm()
        text = ''
        if request.method == 'POST':
            form = HomeForm(request.POST,request.FILES)
            if form.is_valid():
    
                post = form.save(commit=False)
                post.user = request.user
                post.save()
                text = form.cleaned_data['post']
                form = HomeForm()
                form1 = CommentForm()
                return redirect('home:home')
    

    在 post 方法中,您重定向到主页。也就是说,你调用 HomeView 的 get 方法。

    在 get 方法中,您需要在上下文字典中使用以下变量

    args = {
            'form': form, 'posts': posts, 'users': users, 'form1':form1,
            'comments':comments,
        }
    

    但您没有为这些变量设置值。

    【讨论】:

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