检查所有对象是不是属于一个列表 django

Posted

技术标签:

【中文标题】检查所有对象是不是属于一个列表 django【英文标题】:Check if all objects belong to a list django检查所有对象是否属于一个列表 django 【发布时间】:2019-04-06 22:42:35 【问题描述】:

模板:

% for level in levels %
    % if level.todo_set.all in tasks %
    <li>
        <a href="javascript:;"><img src=" level.badge.url "  /></a>
    </li>
    % else %
    <li>
        <a href="javascript:;"><img src=" level.locked_badge.url "  /></a>
    </li>
    % endif %
% endfor %

views.py:

@login_required(login_url="/account/login/")
def StudentPublicProfile(request, pk=None):
    student = User.objects.get(pk=pk)

    levels = Level.objects.all()

    todos = ToDo.objects.all()
    list = []

    tasks = Task.objects.filter(student=student)
    for task in tasks:
        list.append(task.todo)

    context = "student": student, "levels": levels, "tasks": list, "todos": todos

    return render(request, "student_public_profile2.html", context)

models.py:

class Level(models.Model):
    number = models.IntegerField()
    badge = models.ImageField()
    locked_badge = models.ImageField()
    timestamp = models.DateTimeField(
        auto_now_add=True, auto_now=False, blank=True, null=True
    )
    unlock = models.CharField(max_length=10, default="A")

    def __str__(self):
        return str(self.number)

    def get_absolute_url(self):
        return reverse("student:level-detail", kwargs="pk": self.pk)


class ToDo(models.Model):
    level = models.ForeignKey(Level, on_delete=models.CASCADE)
    name = models.CharField(max_length=150)
    description = models.TextField()
    timestamp = models.DateTimeField(
        auto_now_add=True, auto_now=False, blank=True, null=True
    )

    def __str__(self):
        return self.name


class Task(models.Model):
    level = models.ForeignKey(Level, on_delete=models.CASCADE)
    todo = models.ForeignKey(ToDo, on_delete=models.CASCADE)
    student = models.ForeignKey(User, on_delete=models.CASCADE)
    title = models.CharField(max_length=150)
    content = models.TextField()
    timestamp = models.TimeField(auto_now=True)
    datestamp = models.DateField(auto_now=True)
    like = models.ManyToManyField(User, related_name="user_likes", blank=True)
    is_verified = models.BooleanField(default=False, blank=True)

    def __str__(self):
        return self.title

基本上,每个级别都包含多个待办事项。我想检查该级别的所有待办事项是否都包含在任务列表中。这就是我在模板中所做的。但我没有得到正确的结果。这里可能是什么问题?在这里,我正在检查一个级别的所有待办事项是否由特定用户完成。只有当一个待办事项完成时,它才会保存在任务中

【问题讨论】:

你能展示你的模型吗? 确定@DanielRoseman 我更新了@DanielRoseman @DanielRoseman 有什么方法可以检查所有对象是否是另一个列表的子集? 我应该使用模板标签吗?我如何在这里使用它? @丹尼尔罗斯曼 【参考方案1】:
levellist = []
for level in levels:
    if (
        ToDo.objects.filter(level=level).count()
        == Task.objects.filter(student=student, level=level).count()
    ):
        levellist.append(level.number)
    perc = (len(levellist) / len(levels)) * 100

在模板中:

% for level in levels %
    % if level.number in levellist %
    <li>
        <a href="javascript:;"><img src=" level.badge.url " 
        /></a>
    </li>
    % else %
    <li>
        <a href="javascript:;"><img src=" level.locked_badge.url " 
        /></a>
    </li>
    % endif %
% endfor %

找到了解决办法!

【讨论】:

【参考方案2】:

你最好在view 中处理这个问题。

for level in levels_list:
    if Todo.objects.filter(level=level).count() == Task.objects.filter(student=student, level=level).count():
        return (level completion code)

【讨论】:

我不能做级别=级别,因为实际上我必须为级别列表执行此操作,而不是在级别上 尝试为关卡添加for循环 无法弄清楚如何!那我如何传递上下文? 这里传递给上下文的内容以及如何在模板中呈现 尝试将此答案调整为link 级别。用级别替换待办事项

以上是关于检查所有对象是不是属于一个列表 django的主要内容,如果未能解决你的问题,请参考以下文章

检查列表 django 模板中是不是存在

Django - 检查列表是不是包含模板中的某些内容

Django:检查模型字段是不是已回答

检查以检查 Django 中是不是存在数据库表?

如何在javascript中检查Django对象是不是为None?

检查点列表是不是是矩形的一部分