Вам нужно будет передать полный список категорий, а также индекс выбранных пользователем категорий в ваш шаблон.Вам не нужно преобразовывать набор запросов NewsCategory
в список в вашем представлении, например:
View
categories = NewsCategory.objects.all()
user_preferences = [item.id for item in Profile.preference.all()]
Переменная user_preferences
будет действовать как индекс поиска для нашего шаблона.
Затем вы перебираете все категории в шаблоне и проверяете, существует ли он в списке пользовательских настроек:
Шаблон
<div id="c_b">
{% for c in categories %}
<input type="checkbox" name="category[]" id="id_{{ c.category }}" value="{{ c.id }}" {% if c.id in user_preferences %}checked="checked"{% endif %} />
<label for="id_{{ c.id }}">{{ c.category }}</label>
{% endfor %}
</div>
Обновление - сохранение пользовательских настроек
Здесь нет жесткого и быстрого правила.На мой взгляд, основным соображением было бы свести к минимуму попадания в базу данных.Вы можете просто очистить пользовательские настройки, как вы говорите, и добавить новые - фактически, это то, как администратор Django обрабатывает это.Просто используйте управление транзакциями в Django:
from django.db import transaction
@transaction.commit_manually
def add_preferences(user, preferences):
user.preference.clear()
for pref in preferences:
user.preference.add(pref)
transaction.commit()