Created
November 15, 2013 18:22
-
-
Save raphox/7489163 to your computer and use it in GitHub Desktop.
Upload with Flask, Flask-WTF, WTForms and WTForms-Alchemy
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import os | |
from app import app | |
from app.database import db_session | |
from app.models.achievement import Achievement | |
from app.forms.achievement import AchievementForm | |
from flask import Blueprint, render_template, abort, request, redirect, flash, url_for | |
from werkzeug import secure_filename | |
achievements = Blueprint('achievements', __name__, template_folder = 'templates/achievements') | |
@achievements.route('/new') | |
def new(): | |
form = AchievementForm() | |
return render_template('achievements/new.html', form=form) | |
@achievements.route('/create', methods = ['POST']) | |
def create(): | |
model = Achievement() | |
form = AchievementForm() | |
if form.validate_on_submit(): | |
if form.label_path.data: | |
image_data = request.files[form.label_path.name].read() | |
# after validation field data equal the secure filename | |
open(os.path.join(app.config['UPLOAD_PATH'], form.label_path.data), 'w').write(image_data) | |
form.populate_obj(model) | |
db_session.add(model) | |
db_session.commit() | |
flash("Achievement created") | |
return redirect(url_for('achievements.new')) | |
return render_template('achievements/new.html', form=form) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
__all__ = ["user", "achievement"] | |
from flask.ext.wtf import Form | |
from wtforms_alchemy import model_form_factory | |
# Using WTForms-Alchemy with Flask-WTF (http://wtforms-alchemy.readthedocs.org/en/latest/advanced.html#using-wtforms-alchemy-with-flask-wtf) to include all good features of Flask-WTF https://flask-wtf.readthedocs.org/en/latest/#features | |
ModelForm = model_form_factory(Form) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from app.forms import ModelForm | |
from app.models.achievement import Achievement | |
from flask_wtf.file import FileField, FileAllowed, FileRequired | |
from werkzeug import secure_filename | |
class AchievementForm(ModelForm): | |
class Meta: | |
model = Achievement | |
exclude = ['slug'] | |
label_path = FileField(None, [ | |
FileRequired(), | |
FileAllowed(['svg'], 'SVG image only!') | |
]) | |
# change value of field to name of file | |
def validate_label_path(form, field): | |
if field.data: | |
field.data = secure_filename(field.data.filename) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from sqlalchemy import Column, Integer, Boolean, String, Text, ForeignKey | |
from sqlalchemy.orm import relationship | |
from app.database import Base | |
from sqlalchemy_sluggable import Sluggable | |
from app.models.user import User | |
class Achievement(Base, Sluggable): | |
__tablename__ = 'achievements' | |
__sluggable__ = { | |
'populate_from': 'name', | |
'always_update': True | |
} | |
id = Column(Integer, primary_key = True, nullable = False) | |
user_id = Column(Integer, ForeignKey('users.id')) | |
name = Column(String(255), unique = True, nullable = False) | |
description = Column(Text) | |
label_path = Column(String(255), nullable = False) | |
user = relationship("User") | |
def __init__(self, name = None): | |
self.name = name | |
def __repr__(self): | |
return '<Achievement %r>' % (self.name) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{% from "helpers/_form.html" import render_field %} | |
<h1>New</h1> | |
<form method="POST" action="{{ url_for('achievements.create') }}" enctype="multipart/form-data"> | |
<dl> | |
{{ form.hidden_tag() }} | |
{{ render_field(form.name) }} | |
{{ render_field(form.description) }} | |
{{ render_field(form.label_path) }} | |
{{ render_field(form.label_color) }} | |
{{ render_field(form.label_background) }} | |
</dl> | |
<p> | |
<input type="submit" value="create"> | |
</p> | |
</form> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment