我是 Python、Google AppEngine 和 Jinja 的新手。如果我在下面发布了太多代码,我很抱歉。这是我在 StackOverflow 上发布的第一个问题。
我正在构建一个博客(为一个类(class)),我需要替换用户帖子中的换行符“\n”。查询数据库的函数将其结果发送到 render() 函数。
所有代码都可以完美运行,直到我添加了应该替换“\n”的代码行。
我已经完成了各种编辑,但我无法推断出 AppEngine、Jinja 或 Python 希望我做什么来满足它。
我的数据库类设置了四种类型的db_blog Kind,包括'post_content'
class db_blog(db.Model):
post_subject = db.StringProperty(required = True)
post_content = db.TextProperty(required = True)
post_created = db.DateTimeProperty(auto_now_add = True)
post_last_modified = db.DateTimeProperty(auto_now_add = True)
“Newpost”类我希望它从下面的Blog类接收“query_select”对象。
class Newpost(webapp2.RequestHandler):
def write(self, *args, **kwds):
self.response.out.write(*args, **kwds)
def render_str(self, template, **params):
t = jinja_env.get_template(template)
return t.render(params)
def render(self, template, **kwds):
self._render_text = self.post_content.replace("\n", "<br />") ##<-- See here
self.write(self.render_str(template, **kwds))
Blog 类获取所有用户帖子并将它们发送到“Newpost”进行渲染。
class Blog(Newpost):
def get(self):
query_select = db.GqlQuery("SELECT * FROM db_blog ORDER BY post_created DESC")
self.render('blog_posts.htm', query_select = query_select)
1。 如上所示,代码将生成此错误:
属性错误:“博客”对象没有属性“post_content”
我认为类Blog需要继承自db_blog,所以(参见#2)
2。如果我将 db_blog 添加到 Blog 类的参数列表中,我会收到一个新错误:
AttributeError:“NoneType”对象没有属性“replace”
我认为错误告诉我正在传递一个不存在的对象,所以我真的很困惑。如果我注释掉尝试替换“\n”字符的行,则该代码运行完美 - 那么它怎么可能不传递对象呢?或者声称它是==无?
更重要的是,我怎样才能让它工作!
非常感谢您读到这里,并感谢她/他能够让我继续前进。
最佳答案
您收到属性错误的原因是 self
在Newpost.get
指RequestHandler
( Blog
) 并且不到您想要的帖子。我建议,不要在 View 函数中定义转换,而是将其添加为模型上的属性,例如
class db_blog(db.Model):
post_subject = db.StringProperty(required = True)
post_content = db.TextProperty(required = True)
post_created = db.DateTimeProperty(auto_now_add = True)
post_last_modified = db.DateTimeProperty(auto_now_add = True)
@property
def escaped_content(self):
# possibly want to escape HTML in your post_content first
return self.post_content.replace("\n", "<br />")
那么,你就可以传递query_select
到您的模板(正如您当前正在做的那样):
{% for post in query_select %}
{{ post.escaped_content | safe }}
{% endfor %}
你需要使用上面的安全,因为否则 jinja 会逃脱你的 <br />
。由于我看不到您的模板,我不知道这是否完全适合您正在做的事情,但希望您明白这一点。
解释一下上面的 jinja 的三行:
-
{% for post in query_select %}
- 就像 for 循环一样,迭代帖子,每个帖子应该是db_blog
实例(来自您的查询)。 -
post.escaped_content
完全相当于调用escaped_content
Python 中 db_blog 模型的属性。 -
{{ post.escaped_content | safe }}
适用safe
过滤到由转义内容生成的字符串(如果没有safe
,jinja 会将<br />
转换为<br />
(这将在页面上按字面显示<br />
)。 -
{% endfor %}
结束 for 循环。
关于python - 如何替换 Google 数据存储查询结果对象中的字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12084327/