在模板Django中过滤查询

时间:2018-11-02 13:15:49

标签: python django django-templates django-queryset django-template-filters

型号:

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

 def get_absolute_url(self):
    return reverse('student:dashboard')
 objects = PostManager()

 @property
 def comments(self):
    instance = self
    qs = Comment.objects.filter_by_instance(instance)
    return qs

 @property
 def get_content_type(self):
    instance = self
    content_type = 
 ContentType.objects.get_for_model(instance.__class__)
    return content_type

模板:

 {% for level in levels %}
 {% if tasks.filter(student=student,level=level).count == 
   todos.filter(level=level).count %}
 <li>
 <a href="javascript:;"><img src="{{ level.badge.url }}" alt="" /></a>
                        </li>
                        {% else %}
                         <li>
                            <a href="javascript:;"><img src="{{ 
 level.locked_badge.url }}" alt="" /></a>
                        </li>
                          {% endif %}
                        {% endfor %}

示例视图:

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

 tasks=Task.objects.all()

 context={
    'student': student,
    'levels' : levels,
    'tasks' : tasks,
    'todos' : todos,
 }



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

这可能需要一些解释。我有3个模型-Level Todo和Task。每个级别包含许多待办事项。待办事项完成后,即在提交待办事项表单时,将其保存在Task模型中。该表单使用模型形式,因此基本上,任务是一个级别的用户已完成的待办事项集。我要根据以下条件显示级别的徽章:如果某个级别的所有待办事项都已完成,则应该显示一种类型的徽章,如果没有,则应该显示锁定的徽章!我该怎么办?< / p>

我遇到了模板标签。.我制作了这样的自定义标签:

 @register.filter
 def completed(tasks,student, level):
  return tasks.filter(student=student,level=level).count()


 @register.filter
 def alltodos(todo, level):
    return todo.filter(level=level).count()

如何从模板调用函数以使其正常工作?

    {% for level in levels %}
    {% if tasks|completed:tasks,student,level == 
      todos|alltodos:todos,level %}
                        <li>
                            <a href="javascript:;"><img src="{{ 
     level.badge.url }}" alt="" /></a>
                        </li>
                        {% else %}
                         <li>
                            <a href="javascript:;"><img src="{{ 
       level.locked_badge.url }}" alt="" /></a>
                        </li>
                          {% endif %}
                        {% endfor %}

0 个答案:

没有答案