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>
写Django论坛template时遇到的两个问题
写Django论坛template时遇到的两个问题
...