Create proper edit profile form w/ CSRF & refactor User.about_me null/empty string handling

This commit is contained in:
Xevion
2022-03-29 16:37:12 -05:00
parent bad80cf483
commit 839ef370be
5 changed files with 28 additions and 25 deletions

View File

@@ -37,6 +37,9 @@ class User(UserMixin, db.Model):
def get_post_count(self) -> int: def get_post_count(self) -> int:
return len(self.posts) return len(self.posts)
def display_about(self) -> str:
return self.about_me or "This user hasn't written a bio yet."
class Post(db.Model): class Post(db.Model):
id = db.Column(db.Integer, primary_key=True) id = db.Column(db.Integer, primary_key=True)
author = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False) author = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)

View File

@@ -2,7 +2,7 @@ from flask import Blueprint, redirect, render_template, url_for, request
from flask_login import current_user, login_required from flask_login import current_user, login_required
from models import User, Post, Comment from models import User, Post, Comment
from forms import NewPostForm from forms import NewPostForm, EditProfileForm
from database import db from database import db
blueprint = Blueprint('main', __name__) blueprint = Blueprint('main', __name__)
@@ -71,13 +71,24 @@ def view_user(username: str):
return render_template('pages/user.html', user=user) return render_template('pages/user.html', user=user)
@blueprint.route('/user/<username>/edit', methods=['GET']) @blueprint.route('/user/<username>/edit', methods=['GET', 'POST'])
@login_required @login_required
def edit_user(username: str): def edit_user(username: str):
user = User.query.filter_by(username=username).first_or_404() user = db.session.query(User).filter_by(username=username).first_or_404()
if current_user.is_admin or current_user.id == user.id: form = EditProfileForm(request.form)
return render_template('pages/user_edit.html', user=user)
return redirect(url_for('main.view_user', username=username)) if request.method == 'POST':
if form.validate():
if current_user.is_admin or current_user.id == user.id:
user.about_me = form.about_me.data
user.name = form.name.data
db.session.commit()
return redirect(url_for('main.view_user', username=username))
return render_template('pages/user_edit.html', form=form)
form.populate_obj(user)
return render_template('pages/user_edit.html', form=form)
# @blueprint.route('/blogs') # @blueprint.route('/blogs')
# def blogs(): # def blogs():

View File

@@ -24,7 +24,7 @@
<img src="{{ url_for('static', filename='default_photo.png') }}" <img src="{{ url_for('static', filename='default_photo.png') }}"
alt="{{ user.username }}'s Profile Picture"> alt="{{ user.username }}'s Profile Picture">
</div> </div>
<p class="user-box-minibio">{{ user.about_me }}</p> <p class="user-box-minibio">{{ user.display_about() }}</p>
</div> </div>
</div> </div>
{% endfor %} {% endfor %}

View File

@@ -29,7 +29,7 @@
<div class="profile-bio"> <div class="profile-bio">
<p> <p>
<strong>About me:</strong><br> <strong>About me:</strong><br>
{{ user.about_me or "This user hasn't written a bio yet." }} {{ user.display_about() }}
</p> </p>
</div> </div>
</div> </div>

View File

@@ -1,23 +1,12 @@
{% extends 'layouts/index.html' %} {% extends 'layouts/index.html' %}
{% from 'macros.html' import render_field %}
{% block content %} {% block content %}
<h3>Edit Profile</h3> <h3>Edit Profile</h3>
<form method="POST" action="{{ url_for('forms.edit_profile_post', username=user.username) }}" class="form"> <form method="POST" class="form">
<label> {{ form.csrf_token }}
Name<br> {{ render_field(form.name) }}
<input type="text" name="name" value="{{ user.name }}"> {{ render_field(form.about_me) }}
</label><br> <input type="submit" value="Save & Submit">
<label>
About Me
<textarea type="text" name="about-me">{{ user.about_me }}</textarea>
</label>
<button class="button">Save & Submit</button>
</form> </form>
{% with messages = get_flashed_messages() %}
{% if messages %}
<span class="error-message">
{{ messages[0] }}
</span>
{% endif %}
{% endwith %}
{% endblock %} {% endblock %}