【问题标题】:Flask, WTForm, relations烧瓶,WTForm,关系
【发布时间】:2016-12-26 16:18:57
【问题描述】:

我正在尝试创建与父模型Article 相关的图片库。我有两种模型,一种用于存储上传的文件,另一种用于存储image_shots.articles.id 链接的已发布文章。

这是我的模型:

class Media(db.Model):
    __tablename__ = 'media'
    id = db.Column(db.Integer, primary_key=True)
    caption = db.Column(db.String(500))
    article = db.Column(db.Integer, db.ForeignKey('articles.id'), index=True)
    posted_date = db.Column(db.DateTime)

    def __init__(self, **kwargs):
        super(Media, self).__init__(**kwargs)

class Article(db.Model):
    __tablename__ = 'articles'
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(400))
    body = db.Column(db.Text)
    updated_on = db.Column(db.DateTime)
    view_count = db.Column(db.Integer)

    image_shots = db.relationship("Media", backref="articles")

    def __init__(self, **kwargs):
        super(Article, self).__init__(**kwargs)

这是我的表格:

from flask_wtf import Form, validators
from wtforms import StringField, TextAreaField
from wtforms.validators import DataRequired, Length

class ArticleForm(Form):
    title = StringField('Title', validators=[DataRequired(), Length(1, 64), ])
    description = TextAreaField(u'Description', [validators.optional(), validators.length(max=200)])
    file = FileField()

这是我的看法:

@articles.route('/new', methods=['GET', 'POST'])
def articles():
     form = ArticleForm()
     articles = [title for title, in db.session.query(Article)]
     if request.method == 'POST'and form.validate_on_submit():
         article = Article(title=form.name.data)
         db.session.add(article)
         db.session.commit()
         flash(message='Article successfully added')
         return redirect(url_for('articles.index'))
     elif request.method == 'GET':
         articles = [title for title, in db.session.query(Article)]
     return render_template('front/articles.html', articles=articles, form=form)

有了这个,我可以保存发布的文章,但我仍然对如何获取上传的文件并将其保存在他们自己的模型中以articles.id 作为外键感到困惑。

小细节,我需要在同一个文章表单中上传多个形成图库的文件。它们如何联系起来?

【问题讨论】:

  • 问题解决了吗?如果是,请接受我的回答:)

标签: flask sqlalchemy flask-sqlalchemy wtforms flask-wtforms


【解决方案1】:

我现在正在做的项目也有类似的问题。这是一个相册网站,用户创建一个相册并将多个文件上传到这个相册。

这是我的解决方案。

型号:

# import ...
class Photo(db.Model):
    __tablename__ = 'photos'
    id = db.Column(db.Integer, primary_key=True)
    path = db.Column(db.Text)
    about = db.Column(db.Text)
    timestamp = db.Column(db.DateTime, index=True, default=datetime.utcnow)
    author_id = db.Column(db.Integer, db.ForeignKey('users.id'))
    album_id = db.Column(db.Integer, db.ForeignKey('albums.id'))

class Album(db.Model):
    __tablename__ = 'albums'
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.Text)
    about = db.Column(db.Text)
    cover = db.Column(db.Text)
    timestamp = db.Column(db.DateTime, index=True, default=datetime.utcnow)
    author_id = db.Column(db.Integer, db.ForeignKey('users.id'))
    photos = db.relationship('Photo', backref='album', lazy='dynamic')

表格:

# import ...
from flask_wtf.file import FileField, FileAllowed, FileRequired

class NewAlbumForm(Form):
    title = StringField('Title')
    about = TextAreaField('About')
    photo = FileField('Photo', validators=[
    FileRequired(),
    FileAllowed(photos, 'Image Only!')
])
    submit = SubmitField('Submit')

观看次数:

#import ...

@main.route('/new', methods=['GET', 'POST']) # create new album, like yours.
def create():
    from flask_uploads import UploadSet, configure_uploads, IMAGES
    app = current_app._get_current_object()
    photos = UploadSet('photos', IMAGES)
    form = NewAlbumForm()
    if form.validate_on_submit():
        if request.method == 'POST' and 'photo' in request.files:
            filename=[]
            for img in request.files.getlist('photo'): # upload multiple files.
                photos.save(img)
                url = photos.url(img.filename)
                filename.append(url)
        title = form.title.data
        about = form.about.data
        author = current_user._get_current_object()
        album = Album(title=title, about=about,
            cover=filename[0], # use first file as album cover
            author = current_user._get_current_object())
        db.session.add(album)

        for file in filename:
            photo = Photo(path=file, album=album) # save image path.
            db.session.add(photo)
        db.session.commit()
        return redirect(url_for('.album', id=album.id))
    return render_template('new.html', form=form)


@main.route('/user/<username>/albums') # show albums created by user
def albums(username):
    user = User.query.filter_by(username=username).first()
    if user is None:
        abort(404)
    albums = user.albums.order_by(Album.timestamp.desc()).all()
    album_count = len(albums)
    return render_template('albums.html', user=user, albums=albums, album_count=album_count)


@main.route('/album/<int:id>') # show photos in an album
def album(id):
    album = Album.query.get_or_404(id)
    photos = album.photos.order_by(Photo.timestamp.asc())
    return render_template('album.html', album=album, photos=photos)

在模板中,我使用 for 循环来生成图片库。像这样:

/* route: /album/<int:id> */
<div class="container">
  <div class="row">
    {% for photo in photos %}
    <div class="item">     
      <a class="thumbnail" href="">
       <img class="img-responsive" src="{{ photo.path }}">
      </a>
    </div>
    {% endfor %}
  </div>
</div>

我使用 Flask-Uploads 上传多个文件,你可以看看this answer。此外,我使用isotope 对照片进行排序。
可能有点复杂,想问什么都可以问:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-19
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 2020-08-08
    • 1970-01-01
    • 2016-09-06
    相关资源
    最近更新 更多