我想根据登录用户的角色为webapp的首页输出不同的模板。
我使用 PolyModel 数据模型构建了两种类型的“帐户”:
class Account(polymodel.PolyModel):
username = ndb.StringProperty(required = True)
pw_hash = ndb.StringProperty(required = True)
email = ndb.StringProperty(required = True)
class Farmer(Account):
name = ndb.StringProperty(required = True)
class FarmCompany(Account):
name = ndb.StringProperty(required = True)
应用的主页('/')是 index.html ,它使用 jinja2 继承自 base.html :
base.html文件:
<!DOCTYPE html>
<html>
<head>
<title>Farmers App</title>
</head>
<body>
{% block content %}
{% endblock %}
</body>
</html>
的index.html:
{% extends "base.html" %}
{% block content %}
{{ content }}
{% endblock %}
现在,因为我使用了PolyModel数据结构,所以每个'Account'实体都存储如下:
农民帐户'实体示例:
Farmer(
key=Key('Account', 5066549580791808),
class_=[u'Account', u'SkilledPerson'],
name=u'Haopei', ...)
FarmCompany'帐户'实体示例:
FarmCompany(
key=Key('Account', 6863449581091834),
class_=[u'Account', u'FarmCompany'],
name=u'Big Farm Company', ...)
这意味着我可以使用以下函数获取帐户类型:
def check_user_role_by_uid(self, uid):
user = Account.get_by_id(uid)
return user.class_[1] #returns 'Farmer' or 'FarmCompany'
所以我的问题是:
如何根据登录用户是“农民”还是“农场公司”创建两个单独的“index.html”?
答案 0 :(得分:1)
另一种方法:在python中,您可以发送account_type
作为参数。例如:
return {'account': check_user_role_by_uid(uid)}
使用jinja2,您可以选择正确的模板,重复使用HTML并为每个帐户添加特定代码。如果之后您有更多帐户,则更容易扩展
index.html
{% if account == 'Farmer' %}
{% extends "farmer_base.html" %} {# you can extend from different base #}
{% else %}
{% extends "farmcompany_base.html" %}
{% endif %}
{% block content %}
{{ content }}
{% if account == 'Farmer' %}
{# Some Farmer stuff #} {# or you can add particular code for an account #}
{% endif %}
{% endblock %}
答案 1 :(得分:0)
您将创建两个不同版本的index.html。我们称之为index_farm.html和index_farmcompany.html。
然后在你的处理程序中,你将使用适当的版本:
class myHandler(webapp2.RequestHandler):
def get(self):
# somehow get account uiod
type = Account.check_user_role_by_uid(uid)
if type == 'SkilledPerson':
self.render('index_farm.html')
elif type == 'FarmCompany':
self.render('index_farmcompany.html')