2016-08-19 1 views
0

부모 모델 Article과 관련된 이미지 갤러리를 만들려고합니다. 두 모델 (업로드 된 파일을 저장하는 모델과 image_shots.articles.id에 의해 링크 된 게시 된 문서를 저장하는 모델)이 있습니다.플라스크, WTForm, 관계

다음
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() 

내이다 : 여기

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) 

내 형태 : 여기

내 모델입니다이와

@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은 외국어로 와이.

작은 세부 이미지 갤러리를 구성하는 여러 파일을 동일한 기사 양식으로 업로드해야했습니다. 어떻게 연결될 수 있습니까?

+0

문제가 해결 되었습니까? 그렇다면 제 답변을 수락하십시오 :) –

답변

0

저는 지금 당장 프로젝트에서 비슷한 문제가 있습니다. 앨범 웹 사이트이며 사용자가 앨범을 만들고이 앨범에 여러 파일을 업로드합니다.

내 해결책은 다음과 같습니다.

모델 :

# 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) 

, 나는 이미지 GALLARY를 생성하는 루프 사용합니다. 이처럼 :

/* 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> 

내가 여러 파일을 업로드 할 플라스크-업로드를 사용하여, 당신은 this answer에 모습을 얻을 수 있습니다. 게다가, 나는 isotope을 사용하여 사진을 분류한다.
약간 복잡 할 수 있습니다. 물어보고 싶은 것이 무엇이든 물을 수 있습니다.

관련 문제