首页 > 代码库 > 博客的评论功能

博客的评论功能

今天呢,我们一起来新增一个详细页面下的简单评论功能,又是一个简单到我都不好意思说的东东。。。。当然啦,万丈高楼平地起,我们就从简单的开始,以后慢慢添加呗。

还是按照以前的老步骤,models>views>urls>templates.

因为我们要多一个评论功能,所以我们得新建一张用来保存评论数据的表。所已在models添加如下东东:

class BlogComment(models.Model):
    user_name = models.CharField(‘评论者名字‘, max_length=100)
    user_email = models.EmailField(‘评论者邮件‘, max_length=255)
    body = models.TextField(‘评论内容‘)
    created_time = models.DateTimeField(‘评论发表时间‘, auto_now_add=True)
    article = models.ForeignKey(‘Article‘, verbose_name=‘评论所属文章‘, on_delete=models.CASCADE)    def __unicode__(self):
        return self.body[:20]

我们就保存一些简单的数据,前面几个没什么特别的,article是一个外键,关联我们的一个Article。这样每个评论就属于一篇文章,一篇文章可以有好多好多评论。

接下来,我们修改我们的views。不对,不对,我们应该新添加一个forms表单,用来告诉django我们需要在显示页面中显示哪些表单项和如何显示。如果不知道django表单的孩子可以去官网看看django表单概述

反正我是看不懂是个声明鬼,看不懂就跟着风风老师一起做把~(呸!厚颜无耻!)咳咳,我们继续,讲道理的话,如果你们后台增加了markdown编辑器,就已经在myblog/article/目录下新建了一个forms.py就是有views.py的那个目录,如果没有,那你们就新建一个就好了。代码如下

from models import Article, BlogCommentfrom django import formsclass BlogCommentForm(forms.ModelForm):
    class Meta:
        model = BlogComment      #关联一个model
        fields = [‘user_name‘, ‘user_email‘, ‘body‘]  #这里是指我们表单要渲染的字段

        widgets = { #这里定义我们如何渲染,
            # 例如 user_name 渲染后的html组件如下:
            # <input type="text" class="form-control" placeholder="Username" aria-describedby="sizing-addon1">
            ‘user_name‘: forms.TextInput(attrs={                ‘class‘: ‘form-control‘,                ‘placeholder‘: "请输入昵称",                ‘aria-describedby‘: "sizing-addon1",
            }),            ‘user_email‘: forms.TextInput(attrs={                ‘class‘: ‘form-control‘,                ‘placeholder‘: "请输入邮箱",                ‘aria-describedby‘: "sizing-addon1",
            }),            ‘body‘: forms.Textarea(attrs={‘placeholder‘: "我来评两句~"})
        }

那个Meta叫做元选项它用于定义一些Django模型类的行为特性。

我们继续用基于类的视图,(看不懂注释的,可以先瞅瞅后面提取出来的骨架注释)

def post_comment(request, article_id):    #从urls处接受到request请求,并接收一个参数article_id
    if request.method == ‘POST‘:   #判断这个请求是不是post请求,根据判断结果做不同的处理。
        form = BlogCommentForm(request.POST)  #如果是,我们就获取post的表单数据
        if form.is_valid():   # 获取到数据后,我们得先看数据是不是有值,如果合法我们就把数据保存到数据库
            comment_form = form.cleaned_data #如果有值我们就在在cleaned_data属性中找到合法的表单数据
            user_name = comment_form[‘user_name‘]
            user_email = comment_form[‘user_email‘]
            body = comment_form[‘body‘]
            comment = BlogComment.objects.create( #只是创建一个新的BlogComment
                user_name=user_name,
                user_email=user_email,
                body=body,
                article=Article.objects.get(pk=article_id))
            comment.save()            return HttpResponseRedirect(‘/detail/%s/‘ % article_id)保存到数据库完毕后我们就重定向到文章详细页面    else:如果不是post请求,我们第一次访问comment 的url是并不是post请求
        form = BlogCommentForm() #因为是第一次访问,所以我们就把用来获取用户的表单渲染出来,得到一个空的表单form
    return render(request, ‘article/comment.html‘, {‘form‘: form}) #把form表单传递对comment.html

这也许你第一眼看上去有点复杂其实并不复杂,我们把它的骨架提取出来分析,

def post_comment(request): #和以前一样,从url接收到request请求,
    if request.method ==‘POST‘:判断它是不是post请求
        form = BlogCommentForm(request.POST)#如果是,我们就获取表单发过来的数据,
        if form.is_valid():当然发过来之后我们得先判断其和不合法。合法我们才能把数据保存到数据库
            ...     else:#如果不是post请求,在做其他的操作~
        ...

慢慢理解把。。。本屌也刚学了就来写的博客。。。

接下来我们就得得实现表单页面了在myblog/articel/templates/article/目录下新建一个comment.html的文件,代码很简单,如下:

<form method="post">
    {% csrf_token %}  
    <div class="form-group">
        {{ form }}    </div>

    <input type="submit" value="http://www.mamicode.com/提交"></form>
{% csrf_token %}  是为了[跨站请求伪造保护](http://python.usyiyi.cn/django_182/ref/csrf.html)的

{{form}}就是我们的表单了,它会根据form.py中的设置进行渲染,不过简直丑丑哒,为了实现功能,我!忍!了!

还有form并不提供按钮,所以我们最后孩子自己加一个submit

讲道理的话,基本已经可以向数据库里面写入数据了,接下来我们肯定要把数据显示到文章详细页面上,

所以我们先修改views.py

def article_detail(request, article_id):
    article = Article.objects.get(pk=article_id)
    comment_list = BlogComment.objects.filter(article__id=article_id)    return render(request, ‘article/detail.html‘, {‘article‘: article, ‘comment_list‘: comment_list})

我们就新增加了一个查询,把查询到的结果传给表单,当然我们detail.html也得加点什么,为了方便我们还是使用了bootstrap的面板组件:

   ...
    {% for comment in comment_list %}        <div class="panel panel-info">
            <div class="panel-heading">
                <h4>{{ comment.user_name }}<small>{{ comment.created_time }}</small></h4>
            </div>
            <div class="panel-body detail_content">
                    {{ comment.body|custom_markdown }}            </div>
        </div>
    {% endfor %}
{% endblock %}

到此我们简单的评论功能就增添完毕了。不过还是有个小问题,莫名其妙的专门增加一个评论页面是不是蠢蠢哒,大家可以自己试着把评论的页面加到detail.html页面的下面~加油!最后如果你想能在后台编辑评论的内容,就把BlogComment在admin.py中注册。


本文出自 “机制小风风” 博客,请务必保留此出处http://xiaofengfeng.blog.51cto.com/8193303/1885772

博客的评论功能