Фильтр запросов внутри шаблонов Django - PullRequest
0 голосов
/ 02 ноября 2018

Модель:

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 модели - Уровень Тодо и Задача. Каждый уровень содержит много задач. Когда задача завершена, т. Е. Когда передается форма задачи, она сохраняется в модели задач. Форма использует форму модели, поэтому в основном задача представляет собой набор завершенных задач пользователя уровня , Я хочу отображать значки для уровней в зависимости от условия: если все задачи уровня выполнены, на нем должен отображаться значок одного типа, если нет - на заблокированном значке! Как мне это сделать?

Я наткнулся на теги шаблонов. Я делаю свои собственные теги так:

 @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 %}
...