首先创建User模型

class User(UserMixin,db.Model):
__tablename__ = 'users'
  #.. name = db.Column(db.String(64))
location = db.Column(db.String(64))
about_me = db.Column(db.Text())
member_since = db.Column(db.DateTime(),default=datetime.utcnow)
last_seen = db.Column(db.DateTime(),default=datetime.utcnow)

刷新用户访问时间

    def ping(self):
self.last_seen = datetime.utcnow()
db.session.add(self)

app/auth/views.py :更新已登录用户的访问时间

@auth.before_app_request
# def before_request():
# if current_user.is_authenticated:
# current_user.ping()
# if not current_user.confirmed \
# and request.endpoint[:5] != 'auth.' :
# return redirect(url_for('auth.unconfirmed'))

用户资料页面

app/main/views.py

@main.route('/user/<username>')
def user(username):
user = User.query.filter_by(username=username).first()
if user is None:
abort(404)
return render_template('user.html', user=user)

用户资料页面的模板

{% block page_content %}
<div class="page-header">
<h1>{{ user.username }}</h1>
</div>
{% if user.name or user.location %}
<p>
{% if user.name %}{{ user.name }}{% endif %}
{% if user.about_me %}<p>{{ user.about_me }}</p>{% endif %}
{% if user.location %}
From<a href="http://maps.google.com/?q={{ user.location }}">{{ user.location }}</a>
{% endif %}
</p>
{% endif %} {% if current_user.is_administrator() %}
<p><a href="mailto:{{ user.email }}" >{{ user.email }}</a></p>
<a class="btn btn-danger" href="{{ url_for('.edit_profile_admin',id=user.id) }}">Edit</a>
{% endif %}
<p>
Member since {{ moment(user.member_since).format('L') }}.
Last seen {{ moment(user.last_seen).fromNow() }}
</p> {% endblock %}

创建链接

        {% if current_user.is_authenticated %}
<li><a href="{{ url_for('main.user',username=current_user.username) }}">个人资料</a></li>
{% endif %}

用户级别的资料编辑器

class EditProfieForm(FlaskForm):
name = StringField(u'昵称',validators=[Length(0,64)])
location = StringField(u'地址',validators=[Length(0,64)])
about_me = TextAreaField(u'个性签名')
submit = SubmitField(u'提交')

资料编辑页面

app/main/views.py

@main.route('/edit-profile',methods=['GET','POST'])
@login_required
def edit_profile():
form = EditProfieForm()
if form.validate_on_submit():
current_user.name = form.name.data
current_user.location = form.location.data
current_user.about_me = form.about_me.data
db.session.add(current_user)
db.session.commit()
flash(u'更新成功')
return redirect(url_for('.user',username=current_user.username))
form.name.data = current_user.name
form.location.data = current_user.location
form.about_me.data = current_user.about_me
return render_template('edit_profile.html', form=form)

资料编辑的链接

        {% if user == current_user %}
<a class="btn btn-danger" href="{{ url_for('.edit_profile_admin',id=user.id) }}">Edit</a>
{% endif %}

管理员级别的资料编辑表单

app/main/forms.py

class EditProfieAdminForm(FlaskForm):
email = StringField(u'邮箱',validators=[Required(),Length(1,64),Email()])
username = StringField(u'用户名',validators=[Required(),Length(1,64),Regexp('^[A-Za-z][A-Za-z0-9_.]*$',0,u'用户名必须只有字母,数字,.,和下划线')])
confirmed = BooleanField('Confirmed')
role = SelectField('Role',coerce=int)
name = StringField(u'昵称',validators=[Length(0,64)])
location = StringField(u'地址',validators=[Length(0,64)])
about_me = TextAreaField(u'个性签名')
submit = SubmitField(u'提交') def __init__(self,user,*args,**kwargs):
super(EditProfieAdminForm,self).__init__(*args,**kwargs)
self.role.choices = [(role.id,role.name)
for role in Role.query.order_by(Role.name).all()]
self.user = user def valideate_email(self,field):
if field.data != self.user.username and \
User.query.filter_by(username=field.data).first():
raise ValueError('用户名已在使用')

管理员级别的资料编辑路由

@main.route('/edit-profile/<int:id>',methods=['GET','POST'])
@login_required
@admin_required
def edit_profile_admin(id):
user = User.query.get_or_404(id)
form = EditProfieAdminForm(user=user)
if form.validate_on_submit():
user.email = form.email.data
user.username = form.username.data
user.confirmed = form.confirmed.data
user.role = Role.query.get(form.role.data)
user.name = form.name.data
user.location = form.location.data
user.about_me = form.about_me.data
db.session.add(user)
db.session.commit()
flash(u'更新成功')
return redirect(url_for('.user',username=user.username))
form.email.data = user.email
form.username.data = user.username
form.confirmed.data = user.confirmed
form.role.data = user.role_id
form.name.data = user.name
form.location.data = user.location
form.about_me.data = user.about_me
return render_template('edit_profile.html',form=form,user=user)

管理员使用的资料编辑链接

{% if current_user.is_administrator() %}
{% if user == current_user %}
<a class="btn btn-danger" href="{{ url_for('.edit_profile_admin',id=user.id) }}">Edit</a>
{% endif %}

flask-用户资料的更多相关文章

  1. Flask 学习 九 用户资料

    资料信息 app/models.py class User(UserMixin,db.Model): #...... name = db.Column(db.String(64)) location ...

  2. MVC5 网站开发之七 用户功能 3用户资料的修改和删除

    这次主要实现管理后台界面用户资料的修改和删除,修改用户资料和角色是经常用到的功能,但删除用户的情况比较少,为了功能的完整性还是坐上了.主要用到两个action "Modify"和& ...

  3. 鼠标划过用户名时在鼠标右下角显示div展示用户资料

    最近做一个网站论坛,为了方便会员之间相互了解,又不想再做一个页面展示用户资料,就想到了鼠标划过用户名时在鼠标右下角显示div展示用户资料这个效果, 这里要注意的该方法不是给每个用户名的旁边都绑定一个d ...

  4. 解决Discuz“完善用户资料”任务不能完成的问题

    最近用 Discuz X3.2 搭建了个论坛,在测试过程中发现"完善用户资料"这个官方自带的任务有个Bug,将所有的资料都填写完成后,任务仍然无法完成,而且没有明确提示有哪些项目没 ...

  5. 【转】【Android应用开发详解】第01期:第三方授权认证(一)实现第三方授权登录、分享以及获取用户资料

    转载请注明出处:http://blog.csdn.net/yangyu20121224/article/details/9057257 由于公司项目的需要,要实现在项目中使用第三方授权登录以及分享文字 ...

  6. discuz论坛用户资料采集器

    discuz论坛用户资料采集器, 自动采集用户信息!

  7. 【Android应用开发详解】实现第三方授权登录、分享以及获取用户资料

      由于公司项目的需要,要实现在项目中使用第三方授权登录以及分享文字和图片等这样的效果,几经波折,查阅了一番资料,做了一个Demo.实现起来的效果还是不错的,不敢独享,决定写一个总结的教程,供大家互相 ...

  8. 使用ShareSDK实现第三方授权登录、分享以及获取用户资料效果,项目中包含:源码+效果图+项目结构图

    [Android应用开发详解]第01期:第三方授权认证(一)实现第三方授权登录.分享以及获取用户资料   由于公司项目的需要,要实现在项目中使用第三方授权登录以及分享文字和图片等这样的效果,几经波折, ...

  9. SPRING IN ACTION 第4版笔记-第五章BUILDING SPRING WEB APPLICATIONS-006-处理表单数据(注册、显示用户资料)

    一.显示注册表单 1.访问资源 @Test public void shouldShowRegistration() throws Exception { SpitterRepository mock ...

  10. facebook 用curl获取用户资料

    用facebook获取用户信息 $graph_url= "https://graph.facebook.com/me?scope=email&fields=id,name,email ...

随机推荐

  1. Android sdk manager 显示 “Done loading packages”,该怎么办?

    试了这个方法:请用管理员的身份运行"SDK Manager.exe".不管用. 下面的方法可以: 在SDK Manager下Tools->Options打开了SDK Mana ...

  2. 事务的隔离级别和mysql事务隔离级别修改

    A事务做了操作 没有提交 对B事务来说 就等于没做 获取的都是之前的数据 但是 在A事务中查询的话 查到的都是操作之后的数据 没有提交的数据只有自己看得到,并没有update到数据库. 查看InnoD ...

  3. 使用CRA开发的基于React的UI组件发布到内网NPM上去

    前言:构建的ES组件使用CNPM发布内网上过程 1. 使用Create-React-APP开的组件 如果直接上传到NPM,你引用的时候会报: You may need an appropriate l ...

  4. MySQL 如何在一个语句中更新一个数值后返回该值 -- 自增长种子竞态问题处理

    什么是竞态问题? 假设有一个计数器,首先当前值自增长,然后获取到自增长之后的当前值.自增长后的值有可能被有些操作用来当做唯一性标识,因此并发的操作不能允许取得相同的值. 为什么不能使用使用UPDATE ...

  5. 【翻译转载】【官方教程】Asp.Net MVC4入门指南(6):验证编辑方法和编辑视图

    本节中,您将开始修改为电影控制器所新加的操作方法和视图.然后,您将添加一个自定义的搜索页. 在浏览器地址栏里追加/Movies, 浏览到Movies页面.并进入编辑(Edit)页面. Edit(编辑) ...

  6. Mysql order by 排序 varchar 类型数据

    Mysql order by 排序 varchar 类型数据 varchar 类型字段排序,  会將数字当成字符串来处理.  排序规则一般是从左到右一位位来比较. +0之后 就转化成INT 类型排序 ...

  7. 关于ajax中return并不能作为方法的返回值

    接下来关于ajax中的return值最后没有办法是方法的最终返回值问题 login(username,password) { console.log("进入方法"); $.ajax ...

  8. IDEA SpringBoot +thymeleaf配置

    1.pom添加以下依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactI ...

  9. [PCL]对‘pcl::visualization::CloudViewer::CloudViewer(std::string const&)’未定义的引用

    pcl::visualization::CloudViewer viewer("Cloud Viewer"); 这个时候报错. 试了很多方法,有人说,targe t_link 时候 ...

  10. [中文翻译] ASP.NET 5 简介(Introducing ASP.NET 5,原作ScottGu 2015/2/23)

    本文出处  [中文翻译] ASP.NET 5 简介(Introducing ASP.NET 5,原作ScottGu 2015/2/23) 这是我的文章备份 http://www.dotblogs.co ...