繁体   English   中英

Django 在帖子提要上添加评论部分

[英]Django add comment section on posts feed

我想分享一个项目,目前可以创建用户,每个用户可以创建N个帖子
源码可以在github上找到

我有两个模型用户和帖子
在此处输入图片说明

和模板层

在此处输入图片说明

目前,每个帖子的提要都有一个按钮,可以发送评论帖子我想更改它以放置帖子的评论而不是发送和发送电子邮件每个用户应该能够评论帖子并且评论应该保留

{% block container %}
<body id="bg" img style="zoom: 85%; background-position: center center; background-attachment: fixed;background-repeat:no-repeat;padding:5px; background-image: url('{% static "/back.png"%}') ";>
<div style="background-image: url({% static 'static/img/back.png' %});">

    <div class="row" style="align:center">
        {% for post in posts %}
        <div class="col-sm-12 col-md-8 offset-md-4 mt-5 p-0 post-container,width:50%;">
            <div class="card" style="width: 32rem;width:50%;">
                <div class="card-body">
                    <div class="media pt-3 pl-3 pb-1">
                        <a href="{% url " users:detail" post.user.username%}">
                        <img alt="{{ post.user.username }}" class="mr-3 rounded-circle" height="35"
                             src="{{ post.profile.picture.url }}">
                        </a>
                        <h3 class="card-title">{{ post.title }}</h3>
                    </div>

                    <p class="card-text">{{ post.desc }}</p>

                </div>
            </div>
            <img alt="{{ post.title }}" src="{{ post.photo.url }}" style="width: 50%; heigth:60%">

            <div class="media-body">
                <b><p style="margin-top: 5px;">@{{ post.user.username }} - <small>{{ post.created }}</small>
                    &nbsp;&nbsp;
                    <a href="" style="color: #000; font-size: 20px;">
                        <i class="far fa-heart"></i>
                    </a>
                    <br>
                </p></b>


            </div>
            <!-- COMENT SECTION THAT I WANT TO IMPLEMENT MY FEATURE-->
            <form action="{% url 'posts:comment_new' %}" enctype="multipart/form-data" method="POST">
                {% csrf_token %}

                <input
                        class="form-control {% if form.title.errors %}is-invalid{% endif %}"
                        name="title"
                        size="16"
                        type="hidden"
                        value="{{post.title}}"
                >

                <input
                        class="form-control {% if form.title.errors %}is-invalid{% endif %}"
                        name="first_name "
                        size="16"
                        type="hidden"
                        value="{{user.first_name}}"
                >
                <input
                        class="form-control {% if form.title.errors %}is-invalid{% endif %}"
                        name="last_name "
                        size="16"
                        type="hidden"
                        value="{{user.last_name}}"
                >
                <textarea class="form-control" cols="50" name="comment" rows="5"
                          style="width:50%;" value="{{ comments.comment }}"></textarea>
                <button class="btn btn-outline-info btn-lg" style="width:35%; display:block;margin:auto;" type="submit">
                    Publish
                </button>

            </form>
        </div>
        <br>
        {% endfor %}
    </div>
</div>

{% endblock %}

正如我所说,我想替换此表单函数调用以创建评论部分,而不是发送带有评论的电子邮件

< form action = "{% url 'posts:comment_new' %}">


def comment_new(request):
    if request.method == 'POST':
        message = request.POST['comment']
        subject = request.POST['title']
        user = request.POST['first_name']
        last_name = request.POST['last_name']
        # lastname = request.POST['lastname']

        send_mail("[MAIL] " + subject, user + " " + last_name + " said  " + message + " on http://url.com:8000",
                  'guillermo.varelli@gmail.com',
                  ['guillermo.varelli@gmail.com'], fail_silently=False)
    posts = Post.objects.all().order_by('-created')
    return render(request, os.path.join(BASE_DIR, 'templates', 'posts', 'feed.html'), {'posts': posts})

我认为这可能会与用户一起创建评论并发布带有评论详细信息的 ID

def comment_new(request):
    if request.method == 'POST':   
        message = request.POST['comment']
        subject = request.POST['title']
        user = request.POST['first_name']
        last_name = request.POST['last_name']

        #lastname = request.POST['lastname']
        form = PostForm(request.POST, request.FILES)
        form.save()

一个选项它创建一个评论

class Comment(models.Model):
    """
    #id= models.AutoField(max_length=1000, blank=True)

    # post = models.ForeignKey(Post, related_name='',on_delete=models.CASCADE,default=0)
    """

    #comment = models.ForeignKey('posts.Post', related_name='posts_rel', to_field="comments", db_column="comments",
     #                           on_delete=models.CASCADE, null=True, default=1, blank=True)
    post = models.IntegerField(blank=True,null=True,unique=True)
    user = models.ForeignKey(User, on_delete=models.CASCADE,null=True)
    username = models.CharField(blank=True, null=True, unique=True ,max_length=200)
    comment = models.CharField(max_length=254, blank=True, null=True)

然后是表格

class CommentForm(forms.ModelForm):

    class Meta:
        """form settings"""
        model = Comment
        fields = ('user','username','post','comment',)

终于有了我能够坚持但无法呈现的功能

form = CommentForm(request.POST, request.FILES)

# 打印 formset.errors

if form.is_valid():
   form.save()

但我找不到在 html 文件上呈现对象的方法

please feel free to suggest any solution or better create a pull request on the public git hub repo

Django 2 by Example一书中我们可以找到创建评论系统的分步指南,用户可以在其中对帖子发表评论。

为了做到这一点,就如以下四步一样简单

  1. 创建模型以保存评论
  2. 创建表单以提交评论并验证输入数据
  3. 添加处理表单并将新评论保存到数据库的视图
  4. 编辑帖子详细信息模板以显示评论列表和添加新评论的表单

  1. 创建模型以保存评论

在应用程序的 models.py 文件中,添加以下代码

class Comment(models.Model): 
    post = models.ForeignKey(Post,
                             on_delete=models.CASCADE,
                             related_name='comments')
    name = models.CharField(max_length=80) 
    email = models.EmailField() 
    body = models.TextField() 
    created = models.DateTimeField(auto_now_add=True) 
    updated = models.DateTimeField(auto_now=True) 
    active = models.BooleanField(default=True) 

    class Meta: 
        ordering = ('created',) 

    def __str__(self): 
        return 'Comment by {} on {}'.format(self.name, self.post) 

您刚刚创建的新 Comment 模型尚未同步到数据库中。 运行以下命令以生成反映新模型创建的新迁移:

python manage.py makemigrations APPNAME

python manage.py migrate

在此之后,新表存在于数据库中。 现在,打开博客应用程序的 admin.py 文件,导入 Comment 模型,并添加以下 ModelAdmin 类:

from .models import Post, Comment

@admin.register(Comment)
class CommentAdmin(admin.ModelAdmin):
    list_display = ('name', 'email', 'post', 'created', 'active')
    list_filter = ('active', 'created', 'updated')
    search_fields = ('name', 'email', 'body')

  1. 创建表单以提交评论并验证输入数据

编辑博客应用程序的 forms.py 文件并添加以下行:

from .models import Comment

class CommentForm(forms.ModelForm):
    class Meta:
        model = Comment
        fields = ('name', 'email', 'body')

  1. 添加处理表单并将新评论保存到数据库的视图

编辑 views.py 文件,为 Comment 模型和 CommentForm 表单添加导入,并修改帖子详细信息视图,使其如下所示:

from .models import Post, Comment
from .forms import EmailPostForm, CommentForm

def post_detail(request, year, month, day, post):
    post = get_object_or_404(Post, slug=post,
                                   status='published',
                                   publish__year=year,
                                   publish__month=month,
                                   publish__day=day)

    # List of active comments for this post
    comments = post.comments.filter(active=True)

    new_comment = None

    if request.method == 'POST':
        # A comment was posted
        comment_form = CommentForm(data=request.POST)
        if comment_form.is_valid():
            # Create Comment object but don't save to database yet          
            new_comment = comment_form.save(commit=False)
            # Assign the current post to the comment
            new_comment.post = post
            # Save the comment to the database
            new_comment.save()
    else:
        comment_form = CommentForm()                   
    return render(request,
                  'blog/post/detail.html',
                  {'post': post,
                   'comments': comments,
                   'new_comment': new_comment,
                   'comment_form': comment_form})

  1. 编辑帖子详细信息模板以显示评论列表和添加新评论的表单

至此,我们已经创建了管理帖子评论的功能。 现在,我们需要调整我们的 post/detail.html 模板来做以下事情: - 显示评论列表 - 显示一个表单供用户添加新评论

将以下行附加到 post/detail.html 模板以获取评论列表:

{% for comment in comments %}
  <div class="comment">
    <p class="info">
      Comment {{ forloop.counter }} by {{ comment.name }}
      {{ comment.created }}
    </p>
    {{ comment.body|linebreaks }}
  </div>
{% empty %}
  <p>There are no comments yet.</p>
{% endfor %}

然后,对于另一点,添加以下几行:

{% if new_comment %}
  <h2>Your comment has been added.</h2>
{% else %}
  <h2>Add a new comment</h2>
  <form action="." method="post">
    {{ comment_form.as_p }}
    {% csrf_token %}
    <p><input type="submit" value="Add comment"></p>
  </form>
{% endif %}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM