我正在使用Python开发一个项目,并且我有一部分项目工作(用户提交帖子的地方)。我试图让它成为当用户提交他们的条目时,他们被重定向到另一个页面,显示他们发布的所有内容。当我测试这个时,我被重定向到我制作的新页面,但页面是空白的。这是我的代码:
class Handler(webapp2.RequestHandler):
def write(self, *a, **kw):
self.response.out.write(*a, **kw)
def render_str(self, template, **params):
t = jinja_env.get_template(template)
return t.render(params)
def render(self, template, **kw):
self.write(self.render_str(template, **kw))
class Entry(db.Model):
subject = db.StringProperty(required=True)
entry = db.TextProperty(required=True)
created = db.DateTimeProperty(auto_now_add = True)
class MainPage(Handler):
def render_front(self, subject="", entry="", error=""):
blog = db.GqlQuery("SELECT * FROM Entry ORDER BY created DESC LIMIT 10")
self.render("entry.html", subject=subject, entry=entry, error=error, blog=blog)
def get(self):
self.render_front()
def post(self):
subject = self.request.get("subject")
entry = self.request.get("entry")
if subject and entry:
e = Entry(subject = subject, entry=entry)
e.put()
self.redirect("/BlogPost")
else:
error = "To post a new entry, you must add both, a subject and your post"
self.render_front(subject, entry, error)
class BlogPost(Handler):
def get(self):
self.render("blogfront.html")
app = webapp2.WSGIApplication([('/', MainPage), ('/BlogPost', BlogPost)], debug = True)
这只是我的一段代码(我相信错误位于这些行的某处,因为我的头版工作正常)。
这是我的blogfront.html:
<!DOCTYPE html>
<html>
<head>
<title>Blog </title>
</head>
<body>
{% for entry in blog %}
<div class="entry">
<div class="entry-subject">{{entry.subject}}</div>
<label>{{entry.created}}</label>
<hr>
<pre class="entry-body">{{entry.entry}}</pre>
</div>
{% endfor %}
</body>
</html>
entry.html正在加载,而blogfront.html则没有。我不确定我在哪里出错了。我将不胜感激任何帮助。提前谢谢。
答案 0 :(得分:0)
通过对评论者的评论,问题在于,当您在blog
方法中定义render_front()
时,它是一个局部变量,因此当方法返回时它会消失。尝试在BlogPost()
方法中再次检索数据,并将其作为blog
参数传递给self.render()
。没有任何博客数据,模板确实会呈现为空。
因此,您更新的方法可能是:
class BlogPost(Handler):
def get(self):
blog = db.GqlQuery("SELECT * FROM Entry ORDER BY created DESC LIMIT 10")
self.render("blogfront.html", blog=blog)
假设您要查看MainPage()
中显示的相同数据,但您可能还需要其他内容。