diff --git a/forms.py b/forms.py new file mode 100644 index 0000000000000000000000000000000000000000..ad5e62c92b8e08774273737d665f552be94e234f --- /dev/null +++ b/forms.py @@ -0,0 +1,8 @@ +from flask_wtf import FlaskForm +from wtforms import StringField, TextAreaField, SubmitField +from wtforms.validators import DataRequired + +class ProjectForm(FlaskForm): + title = StringField('Title', validators=[DataRequired()]) + description = TextAreaField('Description', validators=[DataRequired()]) + submit = SubmitField('Add Project') diff --git a/my_flask_app.py b/my_flask_app.py index a9442634e8c65539e7e8bab8abdd5982ff562cfa..ffd2955c583e2da87c45926ec17b9eafeb73653f 100644 --- a/my_flask_app.py +++ b/my_flask_app.py @@ -2,8 +2,10 @@ import os import secrets from flask import Flask, render_template, request, redirect, url_for, send_from_directory, abort, current_app from flask_sqlalchemy import SQLAlchemy -from models import db, Project - +from flask_wtf import FlaskForm +from forms import ProjectForm +from wtforms import StringField, TextAreaField, SubmitField +from wtforms.validators import DataRequired app = Flask(__name__, static_folder='static') app.config['SEND_FILE_MAX_AGE_DEFAULT'] = 0 @@ -11,12 +13,18 @@ app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + os.path.abspath(os.path.j app.config['SECRET_KEY'] = secrets.token_hex(16) db = SQLAlchemy(app) + class Project(db.Model): id = db.Column(db.Integer, primary_key=True) title = db.Column(db.String(100), nullable=False) description = db.Column(db.Text, nullable=False) +class ProjectForm(FlaskForm): + title = StringField('Title', validators=[DataRequired()]) + description = TextAreaField('Description', validators=[DataRequired()]) + submit = SubmitField('Add Project') @app.route('/') + def home(): try: projects = Project.query.all() @@ -47,23 +55,22 @@ def portfolio(): def contact(): return render_template('contact.html') -# Updated route for adding a project without Flask-WTF form +# Updated route for adding a project using Flask-WTF form @app.route('/add_project', methods=['GET', 'POST']) def add_project(): - if request.method == 'POST': - # Retrieve form data directly from request - title = request.form.get('title') - description = request.form.get('description') + form = ProjectForm() - # Print or log the form data to check if it's received - print(f"Received form data - Title: {title}, Description: {description}") + if request.method == 'POST' and form.validate_on_submit(): + title = form.title.data + description = form.description.data new_project = Project(title=title, description=description) db.session.add(new_project) db.session.commit() return redirect(url_for('home')) - return render_template('add_project.html') + return render_template('add_project.html', form=form) # Pass the form to the template + # Updated route for serving the 'my-cv.docx' file @app.route('/download_cv') @@ -87,8 +94,8 @@ def download_assessment(filename): print(f"Error serving assessment file: {str(e)}") current_app.logger.exception(f"Error serving assessment file: {str(e)}") abort(500) - + if __name__ == '__main__': with app.app_context(): db.create_all() - app.run(debug=True, port=int(os.environ.get('PORT', 8080))) + app.run(debug=True, port=int(os.environ.get('PORT', 8080))) \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index 65df85baf140ce35bf0eef56cc63cfd249cd40e5..7ecaa2a26b79e5e9a141ff53588b47bf0c8a4cc5 100644 --- a/requirements.txt +++ b/requirements.txt @@ -19,3 +19,6 @@ waitress==2.1.2 Werkzeug==3.0.1 zope.event==5.0 zope.interface==6.1 +Flask-WTF==1.2.1 +wtforms==3.1.2 + diff --git a/templates/add_project.html b/templates/add_project.html index 6d9f8b3375181a385b3591e312818712eb925b59..dc5c064a251f8a83fb95a7904d98159a3d4a8c52 100644 --- a/templates/add_project.html +++ b/templates/add_project.html @@ -11,18 +11,20 @@ <body> <h2>Add Project</h2> <form method="POST" action="{{ url_for('add_project') }}"> - {{ form.csrf_token }} - <div class="form-group"> - {{ form.title.label }} - {{ form.title(class="form-control", placeholder="Enter project title") }} - </div> - <div class="form-group"> - {{ form.description.label }} - {{ form.description(class="form-control", placeholder="Enter project description") }} - </div> - <div class="form-group"> - {{ form.submit(class="btn btn-primary") }} - </div> + {% if form %} + {{ form.csrf_token }} + <div class="form-group"> + {{ form.title.label }} + {{ form.title(class="form-control", placeholder="Enter project title") }} + </div> + <div class="form-group"> + {{ form.description.label }} + {{ form.description(class="form-control", placeholder="Enter project description") }} + </div> + <div class="form-group"> + {{ form.submit(class="btn btn-primary") }} + </div> + {% endif %} </form> </body> </html>