用户的烧瓶配置文件页面

时间:2018-05-26 17:43:32

标签: flask flask-sqlalchemy flask-security

我有一个不同客户的门户网站(房东,房客)

他们有一个注册页面。注册时,我会使用角色对其进行适当标记。

当他们登录时,他们要做的第一件事就是填写他们的个人资料。为此,我创建了一个页面profile.html ...

这些用户除了极少数外几乎都有相似的字段。我对房东有一些属性,有些属于房客。但是它们都有一些类似的字段,比如first_name,last_name,phone,age,sex等......

目前,我维护了两个不同的个人资料表和一个profile.html页面。

我将它们发送到profile.html,我正在使用

{% if user == 'landlord' %}
<html
 <body>
     profile pagefor landlord
</body>
</html>
{% endif %}
{% if user == 'tenant' %}
<html
 <body>
     profile pagefor tenant
</body>
</html>
{% endif %}

如果我为每个用户重复整个HTML块,则上述结构存在问题。

用户填写个人资料后,我会将其显示为只读的profile.html页面,如

{% if user == 'landlord' and profile_filled %}
<html
 <body>
     read only profile page for landlord
</body>
</html>
{% endif %}
{% if user == 'tenant' and profile_filled %}
<html
 <body>
     read only profile page for tenant
</body>
</html>
{% endif %}

使用这些IF的页面profile.html太长了......

有没有办法简化这个?

1 个答案:

答案 0 :(得分:1)

这种情况的常见方法是使用template inheritance,它将公共部分分离为“基础”模板。如,

<html>
...
<body>
{% block content %}{% endblock %}
</body>
</html>

并通过模板继承此基础,这些模板为您的每个条件提供特定内容。例如,为填写简档的房东提供内容的模板看起来像

{% extends "base.html" %}
{% block content %}
read only profile pages for landlord
{% endblock %}

然后在视图方法中选择适当的模板,在那里移动相应的检查。像

这样的东西
@app.route('/profile')
def profile():
    ...
    if user == 'landlord' and user.has_filled_in_profile():
        return render_template("landlord_with_profile.html", ...)
    elif user == 'tenant' and user.has_filled_in_profile():
        return render_template("tenant_with_profile.html", ...)
    elif ...