那年那日那朵花

".......(o´ω`o)......"

django添加多说功能的补充优化

2016-05-17 21:41 python django

django添加多说功能很方便,官方有现成的SDK。使用可以参考官方文档http://dev.duoshuo.com/python-sdk,具体的安装配置可见安装帮助和文档http://dev.duoshuo.com/threads/500c9c58a03193c12400000c

主要记录一下优化。

如果按照官方文档配置完毕后,用chrome按F12会显示一条警告信息

请为<div class="ds-thread">设置data-thread-key属性以便让多说系统能够正确匹配网页和评论,否则很容易导致评论框串号、重复等错误。
http://dev.duoshuo.com/threads/500c9c58a03193c12400000c

根据查看官方的后续文档大致的意思是说,在插入通用代码时,可以增加一些参数,来优化系统避免出错。

那怎么实现呢,首先我们修改引用多说功能的html页面,把文章的id和标题变量在template中传入多说标签中。

<div class="duoshuo">{% duoshuo_comments ArticleObj.id ArticleObj.title %}</div>

修改多说的函数和渲染器,如下

class DuoshuoCommentsNode(Node):
    def __init__(self,article_id,article_title,short_name=DUOSHUO_SHORT_NAME):
        self.article_id = template.Variable(article_id)
        self.article_title = template.Variable(article_title)
        self.short_name = short_name


    def render(self, context):
        #根据上下文转换为真实的变量内容
        actual_article_id = self.article_id.resolve(context)        
        actual_article_title = self.article_title.resolve(context)

        code = '''<!-- Duoshuo Comment BEGIN -->
        <div class="ds-thread" data-thread-key="%s" data-title="%s"></div>
        <script type="text/javascript">
        var duoshuoQuery = {short_name:"%s"};
        (function() {
            var ds = document.createElement('script');
            ds.type = 'text/javascript';ds.async = true;
            ds.src = (document.location.protocol == 'https:' ? 'https:' : 'http:') + '//static.duoshuo.com/embed.js';
            ds.charset = 'UTF-8';
            (document.getElementsByTagName('head')[0] 
             || document.getElementsByTagName('body')[0]).appendChild(ds);
        })();
        </script>
        <!-- Duoshuo Comment END -->''' % (actual_article_id,actual_article_title,self.short_name)
        return code

def duoshuo_comments(parser, token):
    #print token
    #将文章id号和文章标题作为模版变量传入标签
    short_name,article_id,article_title= token.contents.split()

    if DUOSHUO_SHORT_NAME:
        return DuoshuoCommentsNode(article_id,article_title,DUOSHUO_SHORT_NAME)
    elif len(short_name) == 2:
        return DuoshuoCommentsNode(article_id,article_title,short_name[1])
    else:
        raise template.TemplateSyntaxError, "duoshuo_comments tag takes SHORT_NAME as exactly one argument"

duoshuo_comments = register.tag(duoshuo_comments)

说明:

  • token.contents.split()把标签的内容分割为标签名、文章id、文章标题
  • 变量通过渲染器上下文转换为真实的文章id和文章标题
  • 最后在div中增加了data-thread-key和data-title参数

那这样就可以把文章的id和标题作为变量传入多说的通用代码里面了,避免了警告,从而实现优化。

心情

Cloudhu 个人随笔|built by django|

沪ICP备16019452号-1