关于电影编辑章节中的代码bug:AttributeError: 'str' object has no attribute 'filename'

来源:7-9 .电影管理-列表-删除-编辑2

那辰4403872

2018-03-04

报错如下图所示:

http://img.mukewang.com/szimg/5a9b6dd0000143dd10610126.jpg

确定forms.py表单的url和logo选择了FileField字段:

http://img.mukewang.com/szimg/5a9b6e1d00013c9d05020880.jpg

views.py 视图函数也导入了

from werkzeug.utils import secure_filename  # 如下图所示

http://img.mukewang.com/szimg/5a9b6e730001e03109880309.jpg

下图展示具体代码:

# 电影编辑
@admin.route('/movie/edit/<int:id>', methods=["GET", "POST"])
@admin_login_req
def movie_edit(id=None):
    form = MovieForm()
    form.url.validators = []  # 因为可以不做更改,所以不需要校验
    form.logo.validators = []
    movie = Movie.query.get_or_404(id)

    if request.method == "GET":
        form.info.data = movie.info
        form.star.data = movie.star
        form.tag_id.data = movie.tag_id

    if form.validate_on_submit():
        data = form.data
        movie_count = Movie.query.filter_by(title=data["title"]).count()
        if movie_count == 1 and movie.title != data['title']:
            flash("片名已经存在!", "error")
            return redirect(url_for("admin.movie_edit", id=id))

        if not os.path.exists(app.config['UP_DIR']):  # 存放目录不存在则创建
            os.makedirs(app.config['UP_DIR'])
            os.chmod(app.config['UP_DIR'], "rw")

        if form.url.data.filename != '':
            old_url = movie.url
            file_url = secure_filename(form.url.data.filename)  # 获取并转化为安全的电影文件名
            movie.url = change_filename(file_url)  # 调用函数生成新的文件名
            form.url.data.save(app.config['UP_DIR'] + movie.url)  # 保存上传的数据
            if os.path.exists(app.config['UP_DIR'] + old_url):  # 删除旧文件
                os.remove(app.config['UP_DIR'] + old_url)

        if form.logo.data.filename != '':
            old_logo = movie.logo
            file_logo = secure_filename(form.logo.data.filename)
            movie.logo = change_filename(file_logo)
            form.logo.data.save(app.config['UP_DIR'] + movie.logo)
            if os.path.exists(app.config['UP_DIR'] + old_logo):
                os.remove(app.config['UP_DIR'] + old_logo)

        movie.title = data["title"]
        movie.info = data["info"]
        movie.star = int(data["star"])
        movie.tag_id = int(data["tag_id"])
        movie.area = data["area"]
        movie.release_time = data["release_time"]
        movie.length = data["length"]
        db.session.add(movie)
        db.session.commit()
        flash("添加电影成功", "successfully")
        return redirect(url_for("admin.movie_list", id=movie.id))
    return render_template("admin/movie_edit.html", form=form, movie=movie)

movie_edit.html 页面的form表单:的确填写了 enctype="multipart/form-data"

<form role="form" method="post" enctype="multipart/form-data">
    {{ form.csrf_token }}
    ...

望老师百忙之中能够抽出时间为学生解答,O(∩_∩)O谢谢

# 这个bug已经把我弄疯了

写回答

6回答

慕函数5852696

2018-07-21

我也遇到这个问题了我的解决办法是:

判断filename对象是否存在,如果不存在就跳过

if hasattr(form.url.data,'filename'):

1
1
Tejnx
大佬大佬,直接判断可能会报错AttributeError: 'str' object has no attribute 'filename'
2018-12-02
共1条回复

深圳_电信_王觉

2018-05-10

其实,你忘了在 form表单中添加了,<form action="" enctype="multipart/form-data"></form>


添加这个就行了,enctype="multipart/form-data" ,然后再上传看看

0
0

慕娘4228142

2018-05-02

有人能够回答吗

0
0

慕娘4228142

2018-05-02

同问啊,我在添加电影就遇到这个问题了。 

0
0

qq_米兰城的问题青年_0

2018-04-28

同遇到这个问题!

0
0

那辰4403872

提问者

2018-03-04

编辑电影的时候,必须同时把原来的url和logo再上传一遍就不会报错,少上传一个logo或url视频,就会找不到filename

0
0

Python Flask 构建微电影视频网站

Python 最好用轻量级框架,让你轻松胜任 Python Web 工程师

683 学习 · 663 问题

查看课程