概念帮助和数据库查询问题(Django/Python)

2024-09-27 23:16:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试建立一个学习目的的新闻网站。你知道吗

class NewsCategory(models.Model):
    category = models.CharField(max_length=50)

注:一个类别可以是足球,网球,商务。。。用户可以注册到不同的新闻类别。此选项将保存在他们的首选项中。你知道吗

class Profile(models.Model):
    user = models.ForeignKey(User, unique=True)
    gender = models.CharField(max_length=1,blank=True)
    preference = models.ManyToManyField(NewsCategory)

我目前正忙于如何更新每个用户的首选项列表(指定他感兴趣的类别的列表)

查看:

category = [(item.category) for item in NewsCategory.objects.all()]

然后我将category发送到下面的模板

模板:

<div id="c_b">
    {% for c in category %}
        <input type="checkbox" name="category[]" value="{{c}}">
        <label for="{{c}}">{{c}}</label>
    {% endfor %}
</div>

问题:

  1. 在显示模板时,在已保存在用户首选项中的复选框旁边添加选中标记的最佳方法是什么。你知道吗

    我想获得用户注册的所有首选项:saved_preference = user.preference.all(),然后检查category中的每个项目,如果它在saved_preference

    我还想知道如何将其实际写入代码,以及是否应该在视图或模板中完成。

  2. 更新用户首选项列表的好方法是什么?你知道吗

    我计划运行user.preference.clear(),然后检查提交表单中的每个项目,然后运行user.preference.add(the_new_preference)


Tags: 用户模板列表formodelmodels类别新闻
2条回答

您应该学习django中的表单和模型表单。这将是添加和更改的最佳方式。表格将为你做大部分的工作。你知道吗

您需要将完整的类别列表和用户选择的类别索引传递给模板。您不需要将NewsCategory查询集转换为视图中的列表,顺便说一下:

查看

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()

相关问题 更多 >

    热门问题