python - 如何替换 Google 数据存储查询结果对象中的字符?

标签 python google-app-engine inheritance scope jinja2

我是 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”字符的行,则该代码运行完美 - 那么它怎么可能不传递对象呢?或者声称它是==无?

更重要的是,我怎样才能让它工作!

非常感谢您读到这里,并感谢她/他能够让我继续前进。

最佳答案

您收到属性错误的原因是 selfNewpost.getRequestHandler ( 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 的三行:

  1. {% for post in query_select %} - 就像 for 循环一样,迭代帖子,每个帖子应该是 db_blog实例(来自您的查询)。
  2. post.escaped_content完全相当于调用escaped_content Python 中 db_blog 模型的属性。
  3. {{ post.escaped_content | safe }}适用 safe过滤到由转义内容生成的字符串(如果没有 safe ,jinja 会将 <br /> 转换为 &lt;br /&gt; (这将在页面上按字面显示 <br /> )。
  4. {% endfor %}结束 for 循环。

关于python - 如何替换 Google 数据存储查询结果对象中的字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12084327/

相关文章:

c++ - 从C++中的类声明继承

python - 使用文本字符串创建 Pandas 数据框中出现的单词矩阵

python - 循环遍历多个文件夹以清除每个文件夹中的项目

php - APC 未在 Mac OS X 上为 google-app-engine 启用

Python方法覆盖,签名重要吗?

Javascript 创建具有 new 和不具有 new + 继承的对象

python - CGAL 的 python 绑定(bind)发生了什么?

python - 如何深度复制具有包装函数的对象?

java - 使用 Objectify 4 对象化 GenericDao<T>

java - Android studio 编译报错IllegalArgumentException