2013-10-09 4 views
4

내 사용자로 SQLAlchemy의 모델링되어 데이터베이스에 삽입 :플라스크-관리자 업로드 및 자동

class User(Base): 
    __tablename__ = 'users' 
    id = Column(Integer, primary_key=True) 
    url_pic = Column(String(50), nullable=False) 
    (...) 

그리고 나는 나가를 만들 때 그런 방법으로 플라스크-관리자의 데이터베이스에 사용자를 추가 할 사용자, 나는 사진을 직접 업로드 할 수 있으며 대상 URL은 파싱되어 데이터베이스의 url_pic 필드로 전달됩니다.

이미 사용자를 추가하고 사진을 업로드 할 수 있지만 (https://flask-admin.readthedocs.org/en/latest/quickstart/에 설명되어 있음) 추가 사용자와 사진 업로드를 병합하는 방법에 대한 정보는 동일한보기에서 찾을 수 없습니다.

단서가 있습니까?

+1

어떻게 사용자를 추가하고 사진을 업로드 하시겠습니까? 2 가지 다른보기를 사용하고 있습니까? 몇 가지 코드를 공유 할 수 있습니까? – codegeek

+0

내 관리자 패널의보기는 다음과 같습니다. http://pastebin.com/9J6pEA0Z. 상상할 수 있듯이 Content와 FileUpload에 대한 별도의 뷰가 렌더링됩니다 (병합하고 싶기 때문에 콘텐츠를 추가하면 URL은 업로드 된 파일과 동일합니다) Thnks! – gpestana

답변

2

이처럼 보이도록 모델을 수정할 수 있습니다

class User(Base): 
    __tablename__ = 'users' 
    id = Column(Integer, primary_key=True) 
    url_pic = Column(String(50), nullable=False) 
    pic = Column(LargeBinary, nullable=False) 
    ... 

지금 당신이 flask.ext.admin.contrib.sqla에서 ModelView를 서브 클래스해야한다. 그런 다음 해당 하위 클래스의 인스턴스를 Admin 인스턴스에 추가합니다. 다음 소스 코드는 그 요점을 파악하는 데 도움이 될 수 있습니다.

다음
from flask.ext.admin.contrib.sqla import ModelView 
from flask.ext.admin.form.upload import FileUploadField 
from wtforms.validators import ValidationError 
from flask.ext.admin import Admin 
from flask.ext.sqlalchemy import SQLAlchemy 
from flask import Flask 
import imghdr 

app = Flask(__name__) 
db = SQLAlchemy(app) 

class UserAdminView(ModelView): 

    def picture_validation(form, field): 
     if field.data: 
     filename = field.data.filename 
     if filename[-4:] != '.jpg': 
      raise ValidationError('file must be .jpg') 
     if imghdr.what(field.data) != 'jpeg': 
      raise ValidationError('file must be a valid jpeg image.') 
     field.data = field.data.stream.read() 
     return True 

    form_columns = ['id','url_pic', 'pic'] 
    column_labels = dict(id='ID', url_pic="Picture's URL", pic='Picture') 

    def pic_formatter(view, context, model, name): 
     return 'NULL' if len(getattr(model, name)) == 0 else 'a picture' 

    column_formatters = dict(pic=pic_formatter) 
    form_overrides = dict(pic= FileUploadField) 
    form_args = dict(pic=dict(validators=[picture_validation])) 

admin = Admin(app) 
admin.add_view(UserAdminView(User, db.session, category='Database Administration')) 
... 

당신은 ModelView에 대한 문서를 찾을 수 있습니다 :이 사람을 도울 수 있기를 바랍니다 link here 을!

+1

'User' 클래스의'pic'은 경로명을 가진 문자열이어야합니다. 그렇지 않으면 이것이 커다란 프로젝트가되면 많은'LargeBinary'를 데이터베이스에 저장하는 것이 꽤 비쌀 수 있습니다. – Acour83