请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

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

报错如下图所示:

https://img1.sycdn.imooc.com//szimg/5a9b6dd0000143dd10610126.jpg

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

https://img1.sycdn.imooc.com//szimg/5a9b6e1d00013c9d05020880.jpg

views.py 视图函数也导入了

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

https://img1.sycdn.imooc.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已经把我弄疯了

正在回答 回答被采纳积分+3

6回答

慕函数5852696 2018-07-21 14:50:48

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

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

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

1 回复 有任何疑惑可以回复我~
  • Tejnx #1
    大佬大佬,直接判断可能会报错AttributeError: 'str' object has no attribute 'filename'
    回复 有任何疑惑可以回复我~ 2018-12-02 18:19:55
深圳_电信_王觉 2018-05-10 19:54:16

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


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

0 回复 有任何疑惑可以回复我~
慕娘4228142 2018-05-02 16:04:30

有人能够回答吗

0 回复 有任何疑惑可以回复我~
慕娘4228142 2018-05-02 16:04:05

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

0 回复 有任何疑惑可以回复我~

同遇到这个问题!

0 回复 有任何疑惑可以回复我~
提问者 那辰4403872 2018-03-04 13:46:57

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

0 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信