Creating a User-Editable Form Using Flask and SQLite: A Step-by-Step Guide

Creating a User-Editable Form Using Flask and SQLite

Introduction

In this tutorial, we will explore how to create a user-editable form using Flask and SQLite. We will use Flask for the backend API and SQLite as our database management system. The client-side will be done using HTML, CSS, and JavaScript.

Requirements

  • Flask
  • SQLite
  • Python 3.x

Setting Up the Project

First, let’s create a new project directory and navigate into it:

mkdir character_sheet_project
cd character_sheet_project

Next, install all required packages using pip:

pip install flask sqlite3

Create a new file called app.py in our project directory. This is where we will define the Flask application.

Creating the Database

Let’s create a simple database schema using SQLite. Create a new file called database.py.

import sqlite3

class CharacterDB:
    def __init__(self, db_name):
        self.conn = sqlite3.connect(db_name)
        self.cursor = self.conn.cursor()

    def create_table(self):
        self.cursor.execute('''
            CREATE TABLE IF NOT EXISTS characters
            (id INTEGER PRIMARY KEY AUTOINCREMENT, 
            name TEXT, race TEXT, cha_class TEXT, level INTEGER,
            experience INTEGER, alignment_lc TEXT, alignment_ge TEXT,
            height TEXT, weight TEXT, eye_colour TEXT, hair_colour TEXT,
            sex TEXT, age INTEGER, handedness TEXT)
        ''')

    def insert_character(self, character):
        self.cursor.execute('''
            INSERT INTO characters (name, race, cha_class, level, experience,
            alignment_lc, alignment_ge, height, weight, eye_colour, 
            hair_colour, sex, age, handedness) VALUES (:name, :race, 
            :cha_class, :level, :experience, :alignment_lc, :alignment_ge, 
            :height, :weight, :eye_colour, :hair_colour, :sex, :age, 
            :handedness)
        ''', character)

    def update_character(self, character_id, character):
        self.cursor.execute('''
            UPDATE characters SET
                name = :name,
                race = :race,
                cha_class = :cha_class,
                level = :level,
                experience = :experience,
                alignment_lc = :alignment_lc,
                alignment_ge = :alignment_ge,
                height = :height,
                weight = :weight,
                eye_colour = :eye_colour,
                hair_colour = :hair_colour,
                sex = :sex,
                age = :age, 
                handedness = :handedness
            WHERE id = :id AND user_id = :user_id
        ''', character)

    def get_character(self, character_id):
        self.cursor.execute('''
            SELECT *
            FROM characters
            WHERE id = :id AND user_id = :user_id
        ''', {'id': character_id, 'user_id': session['user_id']})
        return self.cursor.fetchone()

# Example usage:
db = CharacterDB('characters.db')
db.create_table()

Creating the Flask App

Now, let’s create the Flask app. Create a new file called app.py.

from flask import Flask, render_template, request, redirect, url_for
from database import db
import session

app = Flask(__name__)
app.config['SECRET_KEY'] = 'your-secret-key'

# Initialize the session
session.init_app(app)

@app.route('/character/<int:character_id>')
def character_sheet(character_id):
    character = db.get_character(character_id)
    return render_template('character_sheet.html', character=character)

@app.route('/edit-character/<int:character_id>', methods=['GET', 'POST'])
def edit_character(character_id):
    if request.method == 'POST':
        character = CharacterDB('characters.db')
        character.update_character(character_id, {
            'name': request.form['name'],
            'race': request.form['race'],
            'cha_class': request.form['cha_class'],
            'level': int(request.form['level']),
            'experience': int(request.form['experience']),
            'alignment_lc': request.form['alignment_lc'],
            'alignment_ge': request.form['alignment_ge'],
            'height': request.form['height'],
            'weight': request.form['weight'],
            'eye_colour': request.form['eye_colour'],
            'hair_colour': request.form['hair_colour'],
            'sex': request.form['sex'],
            'age': int(request.form['age']),
            'handedness': request.form['handedness']
        })
    character = db.get_character(character_id)
    return render_template('character_sheet.html', character=character)

if __name__ == '__main__':
    app.run(debug=True)

Creating the Character Sheet HTML

Create a new file called templates/character_sheet.html.

{% extends "main.html" %}

{% block title %}
    Character Sheet
{% endblock %}

{% block main %}
      <div class="container-fluid">
        <div class="row">
          <div class="col">
            <h3>Basic Information</h3>
          </div>
        </div>
        <div class="row">
          <div class="col border border-dark">
            Name
          </div>
          <div class="col border border-dark">
            {{ character.name }}
          </div>
        </div>
        <div class="row">
          <div class="col border border-dark">
            Race
          </div>
          <div class="col border border-dark">
            {{ character.race }}
          </div>
        </div>
        <!-- ... -->

This is a basic example to get you started. You can add more fields, validation and error handling as needed.

Conclusion

In this tutorial, we created a user-editable form using Flask and SQLite. We used Flask for the backend API and SQLite as our database management system. The client-side was done using HTML, CSS, and JavaScript. This example demonstrates how to create a simple character sheet with editable fields. You can expand on this basic structure to create more complex forms and validation logic.

Additional Resources


Last modified on 2024-11-03