gpt4 book ai didi

python - 使用 Flask-Admin 上传多张图片

转载 作者:行者123 更新时间:2023-11-28 21:46:57 33 4
gpt4 key购买 nike

我正在尝试让文件管理员上传多个文件,但不知道该怎么做。

目前在下面的引用资料中,我一次只能上传一个文件。

https://github.com/flask-admin/flask-admin/blob/master/examples/file/app.py
(指向文件的新链接:https://github.com/mrjoes/flask-admin/blob/master/examples/file/app.py)

我尝试更新 html 模板以具有 multiple="" 但这对上传多个文件没有帮助。


进一步研究我认为这个 html 文件需要有 multiple=""

Python27\Lib\site-packages\flask_admin\templates\bootstrap3\adminC:\Python27\Lib\site-packages\flask_admin\templates\bootstrap3\admin\lib.html

虽然我不确定在不覆盖源文件的情况下在哪里/如何添加这个标签。

最佳答案

您应该按如下方式自定义 ImageUploadInputImageUploadField

import ast
from PIL import Image
from wtforms.widgets import html_params, HTMLString
from wtforms.utils import unset_value
from flask_admin.helpers import get_url
from flask_admin.form.upload import ImageUploadField
from flask_admin._compat import string_types, urljoin

class MultipleImageUploadInput(object):
empty_template = "<input %(file)s multiple>"

# display multiple images in edit view of flask-admin
data_template = ("<div class='image-thumbnail'>"
" %(images)s"
"</div>"
"<input %(file)s multiple>")

def __call__(self, field, **kwargs):

kwargs.setdefault("id", field.id)
kwargs.setdefault("name", field.name)

args = {
"file": html_params(type="file", **kwargs),
}

if field.data and isinstance(field.data, string_types):

attributes = self.get_attributes(field)

args["images"] = "&emsp;".join(["<img src='{}' /><input type='checkbox' name='{}-delete'>Delete</input>"
.format(src, filename) for src, filename in attributes])

template = self.data_template

else:
template = self.empty_template

return HTMLString(template % args)

def get_attributes(self, field):

for item in ast.literal_eval(field.data):

filename = item

if field.thumbnail_size:
filename = field.thumbnail_size(filename)

if field.url_relative_path:
filename = urljoin(field.url_relative_path, filename)

yield get_url(field.endpoint, filename=filename), item

class MultipleImageUploadField(ImageUploadField):

widget = MultipleImageUploadInput()

def process(self, formdata, data=unset_value):

self.formdata = formdata # get the formdata to delete images
return super(MultipleImageUploadField, self).process(formdata, data)

def process_formdata(self, valuelist):

self.data = list()

for value in valuelist:
if self._is_uploaded_file(value):
self.data.append(value)

def populate_obj(self, obj, name):

field = getattr(obj, name, None)

if field:

filenames = ast.literal_eval(field)

for filename in filenames[:]:
if filename + "-delete" in self.formdata:
self._delete_file(filename)
filenames.remove(filename)
else:
filenames = list()

for data in self.data:
if self._is_uploaded_file(data):

self.image = Image.open(data)

filename = self.generate_name(obj, data)
filename = self._save_file(data, filename)

data.filename = filename

filenames.append(filename)

setattr(obj, name, str(filenames))

之后,您可以将它们用作 flask-admin 中的图像上传示例

class ModelHasMultipleImages(db.Model):

id = db.Column(db.Integer(), primary_key=1)

# len of str representation of filename lists may exceed the len of field

image = db.Column(db.String(128))

class ModelViewHasMultipleImages(ModelView):

def _list_thumbnail(view, context, model, name):

if not model.image:
return ''

def gen_img(filename):
return '<img src="{}">'.format(url_for('static',
filename="images/custom/" + form.thumbgen_filename(image)))

return Markup("<br />".join([gen_img(image) for image in ast.literal_eval(model.image)]))

column_formatters = {'image': _list_thumbnail}

form_extra_fields = {'image': MultipleImageUploadField("Images",
base_path="app/static/images/custom",
url_relative_path="images/custom/",
thumbnail_size=(400, 300, 1))}

ModelHasMultipleImages 的图像字段存储文件名列表的 str 表示。

关于python - 使用 Flask-Admin 上传多张图片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37171860/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com