python热爱者Python爬虫作业我爱编程

Django+Bootstrap+Mysql 搭建个人博客

2018-05-22  本文已影响22人  力大士

6.1.comments插件

(1)安装

pip install django-contrib-comments

(02)settings

INSTALLED_APPS = [

          'django.contrib.sites',

          'django_comments',

]

SITE_ID =1

 (3)website/url

url(r'^comments/', include('django_comments.urls')),

(4)修改源码

django_comments/abstracts.py第36行

 原代码

    site = models.ForeignKey(Site, on_delete=models.CASCADE)

修改后

site = models.ForeignKey(Site,default=None,blank=True,null=True,on_delete=models.CASCADE)

 (5)修改源码

 django_comments/abstracts.py第52行

修改和增加了几个字段

class CommentAbstractModel(BaseCommentAbstractModel):

    """    A user comment about some object.

    """# Who posted this comment? If ``user`` is set then it was an authenticated# user; otherwise at least user_name should have been set and the comment# was posted by a non-authenticated user.user = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name=_('user'),

                            blank=True, null=True, related_name="%(class)s_comments",

                            on_delete=models.SET_NULL)

    # Explicit `max_length` to apply both to Django 1.7 and 1.8+.user_email = models.EmailField(_("user's email address"), max_length=254,

                                  blank=True,null=True,default='xxx@xxx.com')

    user_url = models.URLField(_("user's URL"), blank=True,null=True,default='https://xxx.xxx.xxx.xxx')

    user_name = models.CharField(_("user's name"), max_length=50, blank=True)

    user_img = models.ImageField(upload_to="user_images", blank=True,null=True,verbose_name="用户图像")

    comment_title = models.CharField(max_length=256,default="无标题", blank=True,null=True,verbose_name="评论标题")

    parent_comment = models.ForeignKey('self',default=None, blank=True,null=True,related_name="child_comment",on_delete=models.CASCADE)

level= models.PositiveIntegerField(default=0, blank=True,null=True,verbose_name='评论层级') comment = models.TextField(_('comment'), max_length=COMMENT_MAX_LENGTH)

.

.

.

.

 (6)修改源码

 django_comments/admin.py第29和37行

_('Content'),

            {'fields': ('user','user_name','user_email','user_url','comment','comment_title','parent_comment')}

list_display = ('comment_title','name','content_type','object_pk','ip_address','submit_date','is_public','is_removed')

(7)修改源码

 django_comments/forms.py第97行表单

class CommentDetailsForm(CommentSecurityForm):

"""

Handles the specific details of the comment (name, comment, etc.).

"""# name = forms.CharField(label=pgettext_lazy("Person name", "Name"), max_length=50)# email = forms.EmailField(label=_("Email address"))# url = forms.URLField(label=_("URL"), required=False)# Translators: 'Comment' is a noun here.comment = forms.CharField(label=_('Comment'), widget=forms.Textarea,

                              max_length=COMMENT_MAX_LENGTH)

    comment_title = forms.CharField(max_length=256,label=_('标题'))

    parent_id = forms.IntegerField(min_value=-1,label=_('父评论的id'))

    level = forms.IntegerField(min_value=0,label=_('层级'),)

.

.

.

    defget_comment_create_data(self, site_id=None):

        """        Returns the dict of data to be used to create a comment. Subclasses in

        custom comment apps that override get_comment_model can override this

        method to add extra fields onto a custom comment model.

        """        parent_id = self.cleaned_data['parent_id']

        ifparent_id <= 0:

            parent = None

            _level = self.cleaned_data['level']

        else:

            parent = get_model().objects.get(id=parent_id)

            _level = self.cleaned_data['level'] + 4# 4是缩进return dict(

            content_type=ContentType.objects.get_for_model(self.target_object),

            object_pk=force_text(self.target_object._get_pk_val()),

            # user_name=self.cleaned_data["name"],# user_email=self.cleaned_data["email"],# user_url=self.cleaned_data["url"],comment_title = self.cleaned_data['comment_title'],

            parent_comment = parent,

            level = _level,

            comment=self.cleaned_data["comment"],

            submit_date=timezone.now(),

            site_id=site_idorgetattr(settings,"SITE_ID", None),

            is_public=True,

            is_removed=False,

        )

(8)修改源码

django_comments/views/comments.py第97行表单

52行

# 添加ifnotrequest.session.get('login', None)andnot user_is_authenticated:

        returnredirect("/")

116行

# if user_is_authenticated:#    comment.user = request.user#添加ifrequest.session.get('login',None):

        comment.user_name = request.session['screen_name']

        comment.user_img = request.session['profile_image_url']

 以上都修改完后

python manage.py makemigtations

python manage.py migrate

6.2.评论表单

detail.html

                   


                    {% get_comment_formforentry as form %}

                    {% get_comment_countforentry  as comment_count %}

                   

评论总数: {{ comment_count }}

                   
                                                                            {% csrf_token %}

                                                    评论标题:                                                                                                                                                                    评论内容:                                                                                                                                    {{ form.honeypot }}                        {{ form.content_type }}

                        {{ form.object_pk }}

                        {{ form.timestamp }}

                        {{ form.security_hash }}

                                                                                                                                                              重置                                                                                          评论                                                                                       

效果:

现在测试评论,可以添加成功,但是还不能显示

6.3.显示评论

 (1)views.py

fromdjango_comments.modelsimport Commentdef detail(request,blog_id):

    # entry = models.Entry.objects.get(id=blog_id)entry = get_object_or_404(models.Entry,id=blog_id)

    md = markdown.Markdown(extensions=[

        'markdown.extensions.extra',

        'markdown.extensions.codehilite',

        'markdown.extensions.toc',

    ])

    entry.body = md.convert(entry.body)

    entry.toc = md.toc

    entry.increase_visiting()

    comment_list = list()

    def get_comment_list(comments):

        forcommentin comments:

            comment_list.append(comment)

            children = comment.child_comment.all()

            iflen(children) > 0:

                get_comment_list(children)

    top_comments = Comment.objects.filter(object_pk=blog_id, parent_comment=None,

                                          content_type__app_label='blog').order_by('-submit_date')

    get_comment_list(top_comments)

    returnrender(request,'blog/detail.html', locals())

(2)detail.html


                    {% get_comment_form for entry as form %}

                    {% get_comment_count for entry  as comment_count %}

                   

评论总数: {{ comment_count }}


              {#            评论表单#}

            {% if request.session.login or request.user.is_authenticated %}

               

                        {% csrf_token %}

                       

评论标题: 评论内容: {{ form.honeypot }}                        {{ form.content_type }}

                        {{ form.object_pk }}

                        {{ form.timestamp }}

                        {{ form.security_hash }}

                       

  重置   评论             {% else %}

               

登陆后才可以评论

            {% endif %}

           


{#            评论显示区#}

           

            {% for comment in comment_list %}

               

                        {% if comment.user_img %}

                   

{{ comment.comment_title }}                            {% if comment.parent_comment %}

                                        {{ comment.user_name }}{{ request.user }}

                                                                                {{ comment.parent_comment.user_name }}{{ request.user }}

                            {% else %}

                                    By                                          {{ comment.user_name }}{{ request.user }}

                                      On                              {% endif %}

                            {{ comment.submit_date }}                            {% if request.session.login or request.user.is_authenticated %}

                              回复                            {% endif %}

                       

{{ comment.comment }}

            {% endfor %}

(3)static/blog/images/cl.jpg

 设置默认图片(如果没有登录就显示默认图片,为了测试评论)

 (4)blog/blog_comment.css

hr {    border-top: 1px solid lightgrey;    border-bottom: 1px solid #fff;}.single_comment {    margin-bottom: 20px;    font-family: "Microsoft Yahei","微软雅黑",Arial,Helvetica,STHeiti,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";}.single_comment img {    width:50px;    height:50px;    border-radius:50%;    overflow:hidden;    float: left;    margin-left: 10px;    margin-top: 5px;}.single_comment p {    margin-bottom: 0;}.comment-content {    border-bottom: 1px dashed lightgrey;    border-left: 1px dashed #2d7da4;    padding-bottom: 5px;}

detail.html引用

{% block css %}

    {% endblock %}

效果:

6.4.评论回复

(1)blog/urls.py

url(r'^reply/(?P\d+)/$', views.reply, name='comment_reply'),

(2)views.py

fromdjango_commentsimport models as comment_modelsdef reply(request, comment_id):

    ifnotrequest.session.get('login', None)andnot request.user.is_authenticated():

        returnredirect('/')

    parent_comment = get_object_or_404(comment_models.Comment, id=comment_id)

    returnrender(request,'blog/reply.html', locals())

(3)blog/reply.html

{% extends'blog/base.html'%}

{% load comments %}

{% load static %}

{% block title %}回复评论{% endblock %}

{% block css %}

    {% endblock %}

{% block content %}

                                       

                    {%ifrequest.session.login %}

                                            {{ parent_comment.comment_title }}                                    {{ parent_comment.username }} {{ request.user }}                    {{ parent_comment.submit_date }}                               
               

{{ parent_comment.comment }}

                                           
        {%ifrequest.session.loginorrequest.user.is_authenticated %}

                       

回复  {{ parent_comment.username }}{{ request.user }}  的评论:

            {% get_comment_formforparent_comment.content_object as form %}

                                            {% csrf_token %}

                                                    评论标题:                                                                                                                                                                    评论内容:                                                                                                                                    {{ form.honeypot }}                        {{ form.content_type }}

                        {{ form.object_pk }}

                        {{ form.timestamp }}

                        {{ form.security_hash }}

                                                                                                                                                              重置                                                                                          评论                                                                                                {%else%}

           

登陆后才可以评论

        {% endif %}

       
   

        暂时不评论,返回先前页面!        {% endblock %}

(4)detail.html

回复

测试回复功能如下:

上一篇 下一篇

猜你喜欢

热点阅读