[英]How to export WTForms form.data as an XLSX
使用烧瓶很新我创建了一个前端表单,它将创建一个用于列表的 excel 文件。 我在 Flask 上使用 Corey Schafers 教程作为模板。 我猜我需要将“post”.data 值作为字典解析为 openpyxl 或 pandas 之类的东西,但我完全不知道从哪里开始。 “条目”部分是感兴趣的部分。
感谢您花时间看这个。
from flask_wtf import FlaskForm
from flask_wtf.file import FileField, FileAllowed
from flask_login import current_user
from wtforms import StringField, PasswordField, SubmitField, BooleanField, DateTimeField, RadioField, SelectField, \
IntegerField, SelectMultipleField, DateField, validators
from wtforms.validators import DataRequired, Length, Email, EqualTo, ValidationError
from flaskblog.models import User,Entry
from datetime import datetime
from wtforms import widgets
class RegistrationForm(FlaskForm):
username = StringField('Username',
validators=[DataRequired(), Length(min=2, max=20)])
email = StringField('Email',
validators=[DataRequired(), Email()])
password = PasswordField('Password', validators=[DataRequired()])
confirm_password = PasswordField('Confirm Password',
validators=[DataRequired(), EqualTo('password')])
submit = SubmitField('Sign Up')
def validate_username(self, username):
user = User.query.filter_by(username=username.data).first()
if user:
raise ValidationError('That username is taken. Please choose a different one.')
def validate_email(self, email):
user = User.query.filter_by(email=email.data).first()
if user:
raise ValidationError('That email is taken. Please choose a different one.')
class LoginForm(FlaskForm):
email = StringField('Email',
validators=[DataRequired(), Email()])
password = PasswordField('Password', validators=[DataRequired()])
remember = BooleanField('Remember Me')
submit = SubmitField('Login')
class UpdateAccountForm(FlaskForm):
username = StringField('Username',
validators=[DataRequired(), Length(min=2, max=20)])
email = StringField('Email',
validators=[DataRequired(), Email()])
picture = FileField('Update Profile Picture', validators=[FileAllowed(['jpg', 'png'])])
submit = SubmitField('Update')
def validate_username(self, username):
if username.data != current_user.username:
user = User.query.filter_by(username=username.data).first()
if user:
raise ValidationError('That username is taken. Please choose a different one.')
def validate_email(self, email):
if email.data != current_user.email:
user = User.query.filter_by(email=email.data).first()
if user:
raise ValidationError('That email is taken. Please choose a different one.')
class MultiCheckboxField(SelectMultipleField):
widget = widgets.ListWidget(prefix_label=False)
option_widget = widgets.CheckboxInput()
date = datetime.now()
# Entry form content
class Entry(FlaskForm):
User = current_user
Date = date.strftime("%a"' ' "%b" ' ' '%d' ' ' '%Y')
Time = date.strftime("%R")
SKU = StringField("SKU", validators=[DataRequired()])
Parent = BooleanField('Is this a parent SKU?', default='checked')
Brand = SelectField("Enter Brand", choices=['addidas', 'Rebok'], validators=[DataRequired()])
Gender = SelectField("Select Gender", choices=['', 'Female', 'Male', 'Kids'])
Closure = SelectField("Select Closure Type", choices=['', 'test'], validators=[DataRequired()])
Model = StringField("Select Model", validators=[DataRequired()])
Type = SelectField("Select Type", choices=['', 'test'], validators=[DataRequired()])
Colour = SelectField("Select main colour", choices=['', 'test'], validators=[DataRequired()])
Country_Manu = SelectField("Select the country of manufacture", choices=['', 'test'], validators=[DataRequired()])
Upper_Mat = SelectField("Select the upper material", choices=['', 'Leather'], validators=[DataRequired()])
Lining_Mat = SelectField("Select the lining material", choices=['', 'test'], validators=[DataRequired()])
Insole_Mat = SelectField("Select the insole material", choices=['', 'test'], validators=[DataRequired()])
Heel_Height = IntegerField("Input the heel height in cm", validators=[DataRequired()])
Weight = IntegerField("Input the weight in KG", validators=[DataRequired()])
Height = IntegerField("Input the products height in cm", validators=[DataRequired()])
Length = IntegerField("Input the products length in cm", validators=[DataRequired()])
Depth = IntegerField("Input the products depth in cm", validators=[DataRequired()])
Purchase_Ord = StringField("Input the purchase order number", validators=[DataRequired()])
Label = SelectField("Select the label", choices=['', 'test'], validators=[DataRequired()])
Kids_Sizes = MultiCheckboxField("Please Select size", choices=['2', '3', '4', '5', '6'])
Adult_Sizes = MultiCheckboxField("Please Select size", choices=['2', '3'])
submit = SubmitField('Submit')
楷模:
from datetime import datetime
from flaskblog import db, login_manager
from flask_login import UserMixin
import pandas as pd
@login_manager.user_loader
def load_user(user_id):
return User.query.get(int(user_id))
class User(db.Model, UserMixin):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(20), unique=True, nullable=False)
email = db.Column(db.String(120), unique=True, nullable=False)
image_file = db.Column(db.String(20), nullable=False, default='default.jpg')
password = db.Column(db.String(60), nullable=False)
posts = db.relationship('Post', backref='author', lazy=True)
def __repr__(self):
return f"User('{self.username}', '{self.email}', '{self.image_file}')"
class Post(db.Model):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(100), nullable=False)
date_posted = db.Column(db.DateTime, nullable=False, default=datetime.utcnow)
content = db.Column(db.Text, nullable=False)
user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
# Data entry form to be submitted to database
class Entry(db.Model):
id = db.Column(db.Integer, primary_key=True)
user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
Date = db.Column(db.DateTime, default=datetime.utcnow)
SKU = db.Column(db.Integer, unique=True, nullable=False)
Parent = db.Column(db.Boolean)
Brand = db.Column(db.String(20), unique=True, nullable=False)
Gender = db.Column(db.String(20), unique=True, nullable=False)
Closure = db.Column(db.String(20), unique=True, nullable=False)
Type = db.Column(db.String(20), unique=True, nullable=False)
Colour = db.Column(db.String(20), unique=True, nullable=False)
Country_Manu = db.Column(db.String(20), unique=True, nullable=False)
Upper_Mat = db.Column(db.String(20), unique=True, nullable=False)
Lining_Mat = db.Column(db.String(20), unique=True, nullable=False)
Insole_Mat = db.Column(db.String(20), unique=True, nullable=False)
Heel_Height = db.Column(db.Integer, unique=True, nullable=False)
Weight = db.Column(db.Integer, unique=True, nullable=False)
Height = db.Column(db.Integer, unique=True, nullable=False)
Length = db.Column(db.Integer, unique=True, nullable=False)
Depth = db.Column(db.Integer, unique=True, nullable=False)
Purchase_Ord = db.Column(db.Integer, unique=True, nullable=False)
Label = db.Column(db.String(20), unique=True, nullable=False)
Kids_Sizes = db.Column(db.Integer, unique=True, nullable=False)
Adult_Sizes = db.Column(db.Integer, unique=True, nullable=False)
def __repr__(self):
return f"Post('{self.title}', '{self.date_posted}')"
路线:
import os
import secrets
from PIL import Image
from flask import render_template, url_for, flash, redirect, request
from flaskblog import app, db, bcrypt
from flaskblog.forms import RegistrationForm, LoginForm, UpdateAccountForm, Entry
from flaskblog.models import User, Post
from flask_login import login_user, current_user, logout_user, login_required
#from forms import Entry
posts = [
{
'author': 'Corey Schafer',
'title': 'Blog Post 1',
'content': 'First post content',
'date_posted': 'April 20, 2018'
},
{
'author': 'Jane Doe',
'title': 'Blog Post 2',
'content': 'Second post content',
'date_posted': 'April 21, 2018'
}
]
@app.route("/")
@app.route("/home")
def home():
return render_template('home.html', posts=posts)
@app.route("/about")
def about():
return render_template('about.html', title='About')
@app.route("/register", methods=['GET', 'POST'])
def register():
if current_user.is_authenticated:
return redirect(url_for('home'))
form = RegistrationForm()
if form.validate_on_submit():
hashed_password = bcrypt.generate_password_hash(form.password.data).decode('utf-8')
user = User(username=form.username.data, email=form.email.data, password=hashed_password)
db.session.add(user)
db.session.commit()
flash('Your account has been created! You are now able to log in', 'success')
return redirect(url_for('login'))
return render_template('register.html', title='Register', form=form)
@app.route("/login", methods=['GET', 'POST'])
def login():
if current_user.is_authenticated:
return redirect(url_for('home'))
form = LoginForm()
if form.validate_on_submit():
user = User.query.filter_by(email=form.email.data).first()
if user and bcrypt.check_password_hash(user.password, form.password.data):
login_user(user, remember=form.remember.data)
next_page = request.args.get('next')
return redirect(next_page) if next_page else redirect(url_for('home'))
else:
flash('Login Unsuccessful. Please check email and password', 'danger')
return render_template('login.html', title='Login', form=form)
@app.route("/logout")
def logout():
logout_user()
return redirect(url_for('home'))
def save_picture(form_picture):
random_hex = secrets.token_hex(8)
_, f_ext = os.path.splitext(form_picture.filename)
picture_fn = random_hex + f_ext
picture_path = os.path.join(app.root_path, 'static/profile_pics', picture_fn)
output_size = (125, 125)
i = Image.open(form_picture)
i.thumbnail(output_size)
i.save(picture_path)
return picture_fn
@app.route("/account", methods=['GET', 'POST'])
@login_required
def account():
form = UpdateAccountForm()
if form.validate_on_submit():
if form.picture.data:
picture_file = save_picture(form.picture.data)
current_user.image_file = picture_file
current_user.username = form.username.data
current_user.email = form.email.data
db.session.commit()
flash('Your account has been updated!', 'success')
return redirect(url_for('account'))
elif request.method == 'GET':
form.username.data = current_user.username
form.email.data = current_user.email
image_file = url_for('static', filename='profile_pics/' + current_user.image_file)
return render_template('account.html', title='Account',
image_file=image_file, form=form)
@app.errorhandler(404)
def page_not_found(e):
return render_template("404.html"), 404
# internal server error
@app.errorhandler(500)
def page_not_found(e):
return render_template("500.html"), 500
# Entry form
@app.route('/entry', methods=['GET', 'POST'])
@login_required
def entry():
form = Entry()
if form.validate_on_submit():
post = Post(SKU=form.SKU.data,
Parent=form.Parent.data,
Brand=form.Brand.data,
Gender=form.Gender.data,
Closure=form.Closure.data,
Model=form.Model.data,
Type=form.Type.data,
Colour=form.Colour.data,
Country_Manu=form.Country_Manu.data,
Upper_Mat=form.Upper_Mat.data,
Lining_Mat=form.Lining_Mat.data,
Insole_Mat=form.Insole_Mat.data,
Heel_Height=form.Heel_Height.data,
Weight=form.Weight.data,
Height=form.Height.data,
Length=form.Length.data,
Depth=form.Depth.data,
Purchased_Ord=form.Purchase_Ord.data,
Label=form.Label.data,
Kids_Sizes=form.Kids_Sizes.data,
Adult_Sizes=form.Adult_Sizes.data,)
db.session.add(post)
db.session.commit()
flash('Your post has been created!', 'success')
return redirect(url_for('entry'))
return render_template('entry.html', title='Entry',
form=form, legend='Entry')
使用熊猫修复
if form.submit():
# write form data to an excel file
df = pd.DataFrame(form.data, index=[0])
# print dataframe
print(df)
print(SKU)
df.to_excel(xlsx, sheet_name=current_user.username + '_' + str(datetime.date.today()),columns=form.data, index=form.data , startrow=len(df))
df = pd.read_excel(xlsx)
df.to_csv(csv,index=False)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.