Коротко — нужно сохранять состояние в базе (в поле модели) и при рендере шаблона ставить атрибут checked в зависимости от значения этого поля. При отправке формы — читать request.form и обновлять поле модели, затем db.session.commit().
Пример простого варианта (один чекбокс, SQLAlchemy + Flask-Login):
models.py
```
class Account(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True, nullable=False)
acc_settings = db.Column(db.Boolean, default=False) # хранит состояние чекбокса
```
routes.py
```
from flask import render_template, request, redirect, url_for, flash
from flask_login import login_required, current_user
@app.route('/login/settings', methods=['GET', 'POST'])
@login_required
def settings():
if request.method == 'POST':
# чекбокс в форме передаётся только если отмечен
current_user.acc_settings = 'acc_settings' in request.form
db.session.commit()
flash('Настройки сохранены')
return redirect(url_for('settings'))
return render_template('settings.html', user=current_user)
```
settings.html (Jinja2)
```
<form method="post">
{{ csrf_token() }} <!-- если используете CSRF -->
<label>
<input type="checkbox" name="acc_settings" {% if user.acc_settings %}checked{% endif %}>
Мой чекбокс
</label>
<button type="submit">Сохранить</button>
</form>
```
Важно: unchecked чекбокс вообще не попадает в request.form, поэтому в обработчике нужно явно сбрасывать значение (как в примере — проверяем наличие ключа).
Если у пользователя много настроек — удобнее хранить JSON (db.JSON) с ключами настроек:
models.py
```
acc_settings = db.Column(db.JSON, nullable=False, default=lambda: {"notify": False, "dark_mode": False})
```
routes.py
```
if request.method == 'POST':
settings = current_user.acc_settings or {}
settings['notify'] = 'notify' in request.form
settings['dark_mode'] = 'dark_mode' in request.form
current_user.acc_settings = settings
db.session.commit()
```
settings.html
```
<input type="checkbox" name="notify" {% if user.acc_settings.notify %}checked{% endif %}> Уведомления
<input type="checkbox" name="dark_mode" {% if user.acc_settings.dark_mode %}checked{% endif %}> Тёмная тема
```
Рекомендации:
- Используйте Flask-WTF для удобной валидации/CSRF.
- Для идентификации пользователя используйте current_user (Flask-Login) или id из сессии.
- Можно обновлять настройки с помощью AJAX (fetch) чтобы не перезагружать страницу.
- Не забывайте делать миграции, если меняете тип поля в модели.
Если пришлёте ваш текущий код шаблона/модели/роута, могу показать точную правку для вашего случая.