1、原来写的代码是:<tr    valign="top" class={% cycle "style1","style2" %}>,结果编译出错,检查了半天代码,才发现是引号位置写错了,改成<tr    valign="top" class="{% cycle style1,style2 %}">。

2、不管是写论坛还是写博客之类的,应该都至少需要作一下text2html的转换。因为用户的输入的回车换行是’\n’’\r’之类的,如果直接将内容保存下来,再把内容放到template里显示,\r\n是显示不出来的,这个时候需要做一下text2html的转换,即将回车换行的格式转换成<Br>的格式。

很高兴,直接Google "text2html"就把转换的函数给搜出来了,我找的是limodou大侠写的,剩下来的就是用这个函数来处理就可以了。然而,我的调试过程却很曲折。

最开始的做法是,将body的内容转换成html格式存到数据库里:在编辑帖子状态下,再用html2txt转换显示;在显示帖子状态下,tenplate里直接调用诸如{{post.body}}这样显示。
在编辑帖子的状态下,是没有问题的。但在显示帖子的状态下,<Br>等这种可符号居然就直接当字符显示出来了,而不是当回车换行显示出来的。而且,我又想到,如果我帖子内容里就有<Br>这种html转义符,经过text2html和html2text的两次转化,可能原来该有的都给转没了。

搜了一下,看了Uliweb的用法,竟然是框架启动时将text2html嵌入到Template中去,届时在Template里可以直接调用函数显示。Uliweb里是这么写的: {{=text2html(text)}}。

可我用的是Django,自然不能这么写了。想到了自定义Tag,也是几经波折,看了一篇《Django 中自定义 tag 如何获取变量参数的值》,发现Django已与时俱进了,不能那样获得变量参数的数值了。后来自己想办法从Context(上下文)中用了一下变量,果然效果很好,不由感慨Tag的威力也太大了!在Template转换一下就可以了,Text2Html转换的tag示例代码如下(Django1.0,Python2.4.4)。

mytextconvert.py
#coding = utf-8

import re
import cgi
from django import template

register = template.Library()

re_string = re.compile(r’(?P<htmlchars>[<&>])|(?P<space>^[\t]+)|(?P<lineend>\r\n|\r|\n)|(?P<protocal>(^|\s*)((http|ftp)://.*?))(\s|$)’,re.S|re.M|re.I)
def text2html(text, tabstop=4):
    def do_sub(m):
        c = m.groupdict()
        if c[‘htmlchars’]:
            return cgi.escape(c[‘htmlchars’])
        if c[’lineend’]:
            return ‘<br>’
        elif c[‘space’]:
            t = m.group().replace(’\t’, ’ ‘*tabstop)
            t = t.replace(’ ‘, ’ ‘)
            return t
        elif c[‘space’] == ‘\t’:
            return ’ ‘*tabstop;
        else:
            url = m.group(‘protocal’)
            if url.startswith(’ ‘):
                prefix = ’ ‘
                url = url[1:]
            else:
                prefix = ‘’
            last = m.groups()[-1]
            if last in [’\n’, ‘\r’, ‘\r\n’]:
                last = ‘<br>’
            return ‘%s<a href="%s">%s</a>%s’ % (prefix, url, url, last)
    return re.sub(re_string, do_sub, text)


class topicText2htmlNode(template.Node):
    def init(self):
        pass
    def render(self, context):    
        return text2html(context[’topic’].body)

def do_topictextConvert(parser, token):  
    return topicText2htmlNode()

class postText2htmlNode(template.Node):
    def init(self):
        pass
    def render(self, context):
        return text2html(context[‘post’].body)

def do_posttextConvert(parser, token):  
    return postText2htmlNode()


register.tag(‘display_topicbody’, do_topictextConvert)
register.tag(‘display_postbody’, do_posttextConvert)

以下是在Template里的调用示例:

{% load mytextconvert %}

                                                <tr>
                                                    <td    colspan="3"    style="border-top: 1px #aaa solid;">
                                                        <br    /><br>{%display_postbody%} <br />    <br    />
                                                    </td>
                                                </tr>