UnboundLocalError: локальная переменная 'photo', на которую ссылаются до назначения - PullRequest
0 голосов
/ 07 апреля 2020

Каждый раз, когда я публикую новое сообщение без изображения, я получаю эту ошибку. Как сделать так, чтобы я мог публиковать только текст и / или текст с изображением. Заранее спасибо!

Мой постформ

class PostForm(FlaskForm):
    title    = StringField('Title', validators=[DataRequired()])
    content  = TextAreaField('Content', validators=[DataRequired()])
    photo    = FileField('Image to post', validators=[FileAllowed(['jpg', 'png'])])
    submit = SubmitField('POST')

Мой маршрут

   @app.route('/post/new', methods=['GET', 'POST'])
   def new_post():
      form = PostForm()
      if form.validate_on_submit():
         if form.photo.data:
            photo = save_photo(form.photo.data)
         post = Post(title=form.title.data, content=form.content.data, image=photo ,author=current_user)    
         db.session.add(post) 
         db.session.commit()
        ......

Ошибка, полученная от сервера при нажатии кнопки POST post = Post (title = form. title.data, content = form.content.data, image = photo, author = current_user) UnboundLocalError: локальная переменная 'photo', на которую есть ссылка перед присваиванием

Ответы [ 3 ]

0 голосов
/ 07 апреля 2020

Проблема в том, что ваша переменная photo определена внутри блока if, и если ваше условие if равно False, оно не будет определено.

Пожалуйста, попробуйте:

photo = None # put here any default value
if form.photo.data:
    photo = save_photo(form.photo.data)
post = Post(title=form.title.data, content=form.content.data, image=photo ,author=current_user)
0 голосов
/ 07 апреля 2020

Насыщенность if form.photo.data не была Истиной, поэтому переменная photo не была инициализирована. Вы должны добавить оператор else после этого для инициализации переменной photo или просто разбить l oop.

0 голосов
/ 07 апреля 2020

Переменная photo условно назначена, поэтому, если form.photo.data равно false, тогда переменная photo не будет существовать, но строка, которая пытается ее использовать, все равно будет выполнена.

Вероятно, вам следует переместите код с помощью переменной в тот же блок if.

...