Модель:
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 %}