擅长:python、mysql、java
<p>您需要将完整的类别列表和用户选择的类别索引传递给模板。您不需要将<code>NewsCategory</code>查询集转换为视图中的列表,顺便说一下:</p>
<p><strong>查看</p>
<pre><code>categories = NewsCategory.objects.all()
user_preferences = [item.id for item in Profile.preference.all()]
</code></pre>
<p><code>user_preferences</code>变量将充当模板的查找索引。你知道吗</p>
<p>然后遍历模板中的所有类别,并检查它是否存在于用户首选项列表中:</p>
<p><strong>模板</strong></p>
<pre><code><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>
</code></pre>
<p><strong>更新-保存用户首选项</strong></p>
<p>这里没有硬性规定。就我而言,主要考虑的是尽量减少数据库的点击量。你可以像你说的那样清除用户偏好,然后添加新的偏好——事实上,这就是Django的管理员处理它的方式。只需使用Django的事务管理:</p>
<pre><code>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()
</code></pre>