2014-09-20 23 views
0

我目前正在學習一個非常基礎的電子商務平臺。我偶然發現了一些難以找到答案的書籍或資源。但是,我確信應該有一個更簡單的解決方案,我不承認...如何使用Flask將上傳的文件從表單鏈接到模型?

其目的是將文件與其他表單數據一起上載到數據庫,以便文件鏈接到該產品ID。下面是一個例子,

class ProductForm(Form): 
    name = StringField('Design', validators=[Required()]) 
    series = SelectField('Collection', choices=[(c.id, c.name) for c in Series.query.all()], coerce=int) 
    material = SelectField('Material', choices=[(c.id, c.name) for c in Material.query.all()], coerce=int) 
    purity = SelectField('Purity', choices=[(c.id, c.name) for c in Purity.query.all()], default=['1'], coerce=int) 
    description = TextAreaField('Description', validators=[Required()]) 
    price = IntegerField('Price', validators=[Required()]) 
    photo = Filefield('Gallery') 
    submit = SubmitField('Add to Display') 

我知道照片應存放在某個文件夾,而不是在數據庫中,問題是,我不知道如何在數據庫內引用該照片的位置,下面是DB的產品,

class Artwork(db.Model): 
    __tablename__ = 'artworks' 
    id = db.Column(db.Integer, primary_key=True) 
    name = db.Column(db.String(64), index=True) 
    series_id = db.Column(db.Integer, db.ForeignKey('series.id'), default='1') 
    material_id = db.Column(db.Integer, db.ForeignKey('materials.id')) 
    purity_id = db.Column(db.Integer, db.ForeignKey('purities.id')) 
    description = db.Column(db.String) 
    price = db.Column(db.Integer) 
    photo = db.Column(??) 
    timestamp = db.Column(db.DateTime, index=True, default=datetime.utcnow) 

此外,下面是我的view.py

@main.route('/admin', methods=['GET', 'POST']) 
def admin(): 
    form = ProductForm() 
    if form.validate_on_submit(): 
     artwork = Artwork(name=form.name.data, series_id = form.series.data, material_id = form.material.data, purity_id = form.purity.data, description = form.description.data, price = form.price.data) 
     db.session.add(artwork) 
     filename = secure_filename(form.uploads.data.filename) 
     form.uploads.data.save('app/upload/' + filename) 
     flash('The design have been posted.') 
    else: 
     filename = None 
    return render_template('admin.html', form=form, filename=filename) 

任何的產品部件小心權衡對此有何看法?這將使我的一天。

+0

'photo = db.Column(db.String(100))'存儲上傳的'照片'的文件名 – Nava 2014-09-20 06:35:59

+0

是否要將文件保存在數據庫或服務器中的目錄中並將其鏈接到數據庫中? – 2014-09-20 07:13:32

+0

嗨@salmanwahed,感謝您的回覆,我想將該文件保存在一個目錄中,例如app/upload /,但我不確定這是如何工作的。 – Alveus 2014-09-20 09:22:29

回答

0

form你在哪裏發佈,你必須給enctype=multipart/form-data像數據,

<form action="/admin" method="post" enctype="multipart/form-data" >

在您的應用程序,你必須給上傳目錄的路徑,

UPLOAD_FOLDER = '/path/to/the/uploads/'

並在您的案例中將其指定在應用程序的config中,

main.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER

檢查Documentation

您可以給文件的名稱一個唯一生成的名稱,並將filename作爲列中的一行插入數據庫。或者您可以通過您插入的rowid來命名它。這樣你可以找到你的文件的一個項目。我在我的情況下使用第一種方法,並使用uuid生成獨特的filename

+0

問題解決了,非常感謝! – Alveus 2014-09-22 15:53:06

相關問題