Вопрос или проблема
Я создал форму для портфолио, чтобы принимать портфолио пользователя с его изображением и всеми остальными деталями.
Когда я отправляю форму, она всегда возвращает неудачу, и ничего не отправляется.
Как я могу это решить?
Я новичок в этом, пожалуйста, будьте ко мне добры.
def add_picture(picture):
random_hex= secrets.token_hex(8)
_,f_ext=os.path.splitext(picture.filename)
picture_fn= random_hex + f_ext
picture_path= os.path.join(app.root_path,'static/default',picture_fn)
output_size=(200,200)
i=Image.open(picture)
i.thumbnail(output_size)
i.save(picture_path)
return picture_fn
#Для добавления портфолио пользователя
@app.route('/admin/add',methods=['GET','POST'])
@login_required
def create_portfolio():
form=PortfolioForm()
if form.validate_on_submit():
user=User(username=form.username.data,
email=form.email.data,
content=form.content.data,
portfolio=form.portfolio.data,
github_link=form.github_link.data)
if form.image.data:
picture_file=add_picture(form.image.data)
user.img_path=picture_file
db.session.add(user)
db.session.commit()
flash('Портфолио успешно добавлено')
return redirect(url_for('admin'))
else:
flash('Неудачно')
return render_template('add_portfolio.html',title="Добавить портфолио",form=form)
Я ожидал, что это будет отправлено, чтобы я мог отобразить эту информацию.
Это база данных:
class User(db.Model):
id:Mapped[int]= mapped_column(primary_key=True)
username: Mapped[str] = mapped_column(nullable=False,unique=True)
email: Mapped[str] = mapped_column(nullable=False,unique=False)
content : Mapped[str] = mapped_column(nullable=True,unique=False)
portfolio : Mapped[str] = mapped_column(nullable=True,unique=False)
github_link : Mapped[str] = mapped_column(nullable=True,unique=False)
img_path : Mapped[str] = mapped_column(nullable=False,default="default.jpg")
Это форма:
class PortfolioForm(FlaskForm):
username= StringField('Имя пользователя',validators=[InputRequired(),Length(min=3,max=60)])
email = StringField('Электронная почта', validators=[InputRequired(),Email()])
content = StringField('Навыки', validators=[InputRequired(),Length(min=2,max=60)])
github_link = StringField('Введите ссылку на ваш профиль GitHub',validators=[InputRequired()])
image= FileField('Фотография профиля',validators=[FileAllowed(['jpg','png','jpeg',])])
portfolio = TextAreaField('Портфолио',validators=[InputRequired()])
submit = SubmitField('Отправить портфолио')
{% extends 'base.html' %}
{% block content %}
<div>
<h1>Добавить портфолио</h1>
<form method="POST" action="" enctype="multipart/form-data">
{{ form.hidden_tag() }}
<fieldset class="form-group">
<legend class="border-bottom mb-4">Добавить портфолио</legend>
<div>
{{ form.username.label(class="form-control-label") }}
{{ form.username(class="form-control form-control-lg") }}
</div>
<div>
{{ form.email.label(class="form-control-label") }}
{{ form.email(class="form-control form-control-lg") }}
</div>
<div>
{{ form.portfolio.label(class="form-control-label") }}
{{ form.portfolio(class="form-control form-control-lg") }}
</div>
{{ form.image.label(class="form-control-label") }}
{{ form.image(class="form-control-file form-control-lg") }}
<small class="text-muted">Допускаемые типы файлов: jpg, png, jpeg</small>
</div>
<div class="form-group">
{{ form.submit(class="btn btn-outline-info") }}
</div>
</fieldset>
</form>
</div>
{% endblock %}
Любые советы по структурированию будут оценены.
Ответ или решение
Проблема, с которой вы столкнулись, связана с валидацией вашей формы, которая не проходит на этапе отправки. Рассмотрим, как вы можете решить эту проблему.
1. Проверка условий валидации
Первое, что нужно сделать, — это убедиться, что вы проверяете на ошибки валидации формы. Если форма не проходит валидацию, вы можете получить информацию об ошибках, вызванных неправильными данными. Чтобы сделать это, вы можете вывести ошибки на страницу, добавив следующее в код вашего маршрута create_portfolio
:
if form.validate_on_submit():
...
else:
flash('Unsuccessful')
for field, errors in form.errors.items():
for error in errors:
flash(f'Error in {getattr(form, field).label.text}: {error}')
2. Изучение вашего кода модели
Убедитесь, что ваша модель User
правильно настроена для хранения всех данных. Проверьте, что входные данные формы соответствуют ограничением, установленным в модели. Например, здесь есть часть кода, которая устанавливает nullable=False
для img_path
, но в случае, если изображение не загружено, может возникнуть конфликт при сохранении в базе данных:
img_path: Mapped[str] = mapped_column(nullable=False, default="default.jpg")
Если у вас нет загруженного изображения, значение по умолчанию будет установлено, и проблем возникнуть не должно.
3. Проверка формы
Проверьте форму PortfolioForm
на наличие возможных ошибок. Например, атрибут FileAllowed
должен быть настроен правильно, чтобы разрешить только указанные форматы файлов (jpg
, png
, jpeg
). Убедитесь, что файл изображения действительно соответствует этим критериям:
image= FileField('Profile Picture', validators=[FileAllowed(['jpg', 'png', 'jpeg'])])
4. Шаблон формы
В шаблоне формы убедитесь, что атрибут enctype
установлен. Этот атрибут важен для передачи файлов:
<form method="POST" action="" enctype="multipart/form-data">
5. Проверка данных на клиенте
Не забывайте проверять данные на клиенте перед их отправкой. Убедитесь, что все обязательные поля заполнены, а загружаемый файл имеет правильный формат.
6. Логирование ошибок
Если проблема продолжается, используйте логирование для отслеживания возникающих ошибок. Добавьте допустимый уровень логирования, чтобы следить за тем, что происходит:
import logging
logging.basicConfig(level=logging.DEBUG)
# В вашем маршруте
try:
if form.validate_on_submit():
...
except Exception as e:
logging.error("Error while processing form: %s", e)
Это позволит вам узнать больше о том, что может происходить в фоновом режиме.
Заключение
Если вы выполните вышеуказанные шаги, это должно помочь вам определить и исправить причину, по которой ваша форма не валидируется. Обратите внимание на сообщения об ошибках и исправьте свои входные данные, чтобы они соответствовали ожиданиям модели и формы. В случае, если у вас все еще возникают проблемы, не стесняйтесь делиться конкретными сообщениями об ошибках или поведением, чтобы можно было более точно диагностировать проблему.