Как в приложении на Flask сохранить состояние настроек (например, отмеченные чекбоксы), чтобы при переходе на нужную страницу они отображались ранее выбранными?

Как сделать так, чтобы при открытии маршрута /login/settings чекбокс в шаблоне отображал состояние, сохранённое в поле acc_settings модели ACCAUNTS (т. е. был отмечен или нет в соответствии с настройками пользователя)? Пример шаблона и модели/роута: <br/> <pre><code class="html">{% extends "index.html" %}
  • 10 марта 2026 г. 9:16
Ответы на вопрос 2
Коротко — нужно сохранять состояние в базе (в поле модели) и при рендере шаблона ставить атрибут 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) чтобы не перезагружать страницу.
- Не забывайте делать миграции, если меняете тип поля в модели.

Если пришлёте ваш текущий код шаблона/модели/роута, могу показать точную правку для вашего случая.
Использовать БД, печеньки или локальное хранилище, а для установки состояния элемента ввода — соответствующий аттрибут.
Похожие вопросы