So i am making a review website, and one of the website pages I display all the reviews and have filter options to filter by latest and oldest reviews and another drop down menu filter to filter by a value (course). Everything seems to work well, but I notice every now and then it break when I use the drop down menu filter, and a I try to click on the next page of the pagination (if there is one) it will go back to a previous value review I filtered by.
# Reviews page
latest_posts = True # Flag to check if we need to grab the latest posts
setup = True # Flag to check if we need to setup the filter course dropdown
courses = ['ALL'] # List of all courses to allow user to filter by course
current_course_filter = 'ALL' # Current course filter
@main.route("/reviews", methods=['GET', 'POST'])
def reviews():
# Need to make this global so we can change it in the function
global latest_posts, setup, current_course_filter
# Paginate / Pagination is where we split items (posts/reviews) into separate pages for readability
# and also to prevent longer loading times for each page
page = request.args.get('page', 1, type=int) # default 1
# TODO FIX ISSUE WITH PAGINATION ON REVIEWS PAGE FOR FILTERED REVIEWS
# Grab 5 posts per page (default)
if latest_posts:
if current_course_filter != 'ALL': # If we have a course filter then filter by that
posts = Reviews.query.filter_by(course=current_course_filter).order_by(Reviews.date.desc()).paginate(page=page, per_page=5)
else:
posts = Reviews.query.order_by(Reviews.date.desc()).paginate(page=page, per_page=5)
else:
if current_course_filter != 'ALL':
posts = Reviews.query.filter_by(course=current_course_filter).order_by(Reviews.date.asc()).paginate(page=page, per_page=5)
else:
posts = Reviews.query.order_by(Reviews.date.asc()).paginate(page=page, per_page=5)
# Check if we receive a POST request
if request.method == "POST":
if request.form.get("latest"):
if current_course_filter != 'ALL':
posts = Reviews.query.filter_by(course=current_course_filter).order_by(Reviews.date.desc()).paginate(page=page, per_page=5)
else:
posts = Reviews.query.order_by(Reviews.date.desc()).paginate(page=page, per_page=5)
latest_posts = True
elif request.form.get("oldest"):
if current_course_filter != 'ALL':
posts = Reviews.query.filter_by(course=current_course_filter).order_by(Reviews.date.asc()).paginate(page=page, per_page=5)
else:
posts = Reviews.query.order_by(Reviews.date.asc()).paginate(page=page, per_page=5)
latest_posts = False
elif request.form.get("course_select"):
course_selection = request.form.get('course_select')
current_course_filter = course_selection # Update the current course filter
if course_selection == 'ALL': # If we select 'ALL' then we want to grab all posts
posts = Reviews.query.order_by(Reviews.date.desc()).paginate(page=page, per_page=5)
else:
posts = Reviews.query.filter_by(course=course_selection).order_by(Reviews.date.desc()).paginate(page=page, per_page=5)
# Check if we need to setup the filter course dropdown
if setup:
for value in Reviews.query.distinct(Reviews.course): # Grab all unique courses
courses.append(value.course)
setup = False
return render_template("reviews.html", reviews=posts, courses=courses)