python - 如果对象存在,Django过滤并显示在模板中
问题描述
模型.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 PostManager(models.Manager):
def active(self, *args, **kwargs):
#Post.objects.all() = super(PostManager, self).all()
return super(PostManager,
self).filter(draft=False).filter(publish__lte=timezone.now())
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
我的意见.py:
@login_required(login_url='/account/login/')
def StudentLevelDetailView(request,pk=None):
if not request.user.is_client:
return HttpResponse("You are in trainer account")
else:
Client=ClientProfile.objects.get(user=request.user)
subscription=Client.subscription
instance = get_object_or_404(Level, pk=pk)
todos=ToDo.objects.filter(level=instance)
tasks=Task.objects.filter(todo=todos,level=instance)
notifications =
Notification.objects.exclude(sender=request.user)
.filter(receiver=request.user).order_by('-timestamp')
acceptnotify = Addnotify.objects
.filter(receiver=request.user).order_by('-timestamp')
follownotify = FollowNotify.objects
.filter(receiver=request.user).order_by('-timestamp')
hubnotifications = HubNotify.objects
.filter(receiver=request.user).order_by('-timestamp')
newnotifications = int(
Notification.objects.exclude(sender=request.user)
.filter(receiver=request.user, viewed=False).count() +
FollowNotify.objects.exclude(sender=request.user)
.filter(receiver=request.user, viewed=False).count() +
HubNotify.objects.exclude(sender=request.user)
.filter(receiver=request.user, viewed=False).count() +
Addnotify.objects.exclude(sender=request.user)
.filter(receiver=request.user, viewed=False).count())
global is_paid_member
global is_paid_fellow
context = {
'paidmember':is_paid_member,
'paidfellow': is_paid_fellow,
'task': instance,
'tasks':tasks,
'notifications': notifications,
'newnotify': newnotifications,
'completed':False,
'subscription': subscription,
'hubnotify': hubnotifications,
'acceptnotify': acceptnotify,
'follownotify': follownotify,
}
return render(request,'task_list.html',context)
模板:
{% for obj in task.todo_set.all %}
<div class="card">
<div class="card-header" id="headingOne">
<h5 class="mb-0">
<button style="width: 100%;" class="btn" data-
toggle="collapse" data-target="#{{ obj.id }}" aria-expanded="true">
#Only display based on condition
<span class="mytaskbutton"><i class="fas fa-check"></i>
</span></i>
{{ obj.name }}
</button>
</h5>
</div>
<div id="{{ obj.id }}" class="collapse" aria-
labelledby="headingOne" data-parent="#accordion">
<div class="card-body">
{{ obj.description }}
<div>
<a data-click="swal-taskcompleted" href="{% url 'student:task-
form' task.id obj.id %}" style="width: 100%;" type="button"
class="btn btn-primary">Proceed</a>
</div>
</div>
</div>
</div>
{% endfor %}
填写表格时保存任务:
@login_required(login_url='/account/login/')
def TaskCreateView(request,pk,todo_id):
if not request.user.is_authenticated:
return redirect('accounts:index')
elif User.objects.filter(pk=request.user.pk,
mentor__isnull=True).exists():
instance = get_object_or_404(Level, pk=pk)
sweetify.error(request, 'You have not added a trainer yet')
print("TRAINER ILADA")
return HttpResponseRedirect(instance.get_absolute_url())
else:
instance = get_object_or_404(Level, pk=pk)
qs = instance.todo_set.get(id=todo_id)
#user = Task.objects.filter(student=request.user)
todo = Task.objects.filter(todo=qs, student=request.user)
print("TODO COUNT",todo.count())
if todo.exists():
print("TODO COUNT ALRAESY EXISTA", todo.count())
messages.error(request, 'You already completed this task')
return redirect('student:level-detail',pk=instance.id)
form = StudentTaskForm(request.POST or None, request.FILES or None)
if form.is_valid():
form.instance.user = User.objects.get(id=request.user.id)
obj = form.save(commit=False)
obj.student = request.user
obj.todo = qs
obj.level = instance
obj.save()
ImageFormSet = modelformset_factory(Images,
form=ImageForm,min_num=0,
max_num=3,
validate_min=True,extra=3)
if request.method == 'POST':
formset = ImageFormSet(request.POST, request.FILES,
queryset=Images.objects.none())
if formset.is_valid():
for form in formset.cleaned_data:
try:
image = form['image']
Images.objects.create(post=todo[0],image=image)
except KeyError:
pass
return redirect('student:dashboard')
else:
formset = ImageFormSet(queryset=Images.objects.none())
notifications =
Notification.objects.exclude(sender=request.user)
.filter(receiver=request.user)
newnotifications = int(
Notification.objects.exclude(sender=request.user)
.filter(receiver=request.user, viewed=False).count() +
FollowNotify.objects.exclude(sender=request.user)
.filter(receiver=request.user, viewed=False).count() +
HubNotify.objects.exclude(sender=request.user)
.filter(receiver=request.user, viewed=False).count() +
Addnotify.objects.exclude(sender=request.user)
.filter(receiver=request.user, viewed=False).count())
hubnotifications=HubNotify.objects
.filter(receiver=request.user).order_by('-timestamp')
acceptnotify = Addnotify.objects
.filter(receiver=request.user).order_by('-timestamp')
follownotify = FollowNotify.objects
.filter(receiver=request.user).order_by('-timestamp')
counts=int(todo.count())
context={
'form': form,
"qs": qs,
'todo':todo,
'formset': formset,
'notifications': notifications,
'hubnotify': hubnotifications,
'newnotify': newnotifications,
'acceptnotify': acceptnotify,
'follownotify': follownotify,
}
return render(request,'task_form.html',context)
StudentTaskForm 是一个模型表单。有模型作为任务
我有 3 个模型。待办事项、关卡和任务。每个级别包含许多“待办事项”。任务基本上都是完成的todos。所以如果一个待办事项完成了,它就会被保存为一个任务。如果“待办事项”已经完成,我希望显示“待办事项”列表中的复选图标,也就是说,如果这个“待办事项”被保存为任务。仅当此待办事项完成时,才应显示具有“fas fa-check”类的图标。“待办事项”显示为列表。在模板中,关卡作为“任务”传递...所以关卡中的所有“待办事项”都由 task.todo_set.all 拉取...我想要任务中的“待办事项”,基本上是所有已完成的待办事项都有检查
解决方案
因此,您希望todos
在已完成level
的内容student
旁边checks
显示所有内容。
看法
# find all todos for level.
todos=ToDo.objects.filter(level=instance)
# lists to hold todos.
complete = []
incomplete = []
# Separate complete and incomplete todos.
for todo in todos:
# Check if task exists to signify complete.
if Task.objects.filter(student=student, todo=todo).exists():
complete.append(todo)
else:
# If no task, add to incomplete.
incomplete.append(todo)
# Send both lists to template.
{'complete': complete, 'incomplete': incomplete}
模板
{% for c in complete %}
<!-- If complete make it checked. -->
<div><input type="checkbox" checked>Todo Detail</div>
{% endfor %}
{% for i in incomplete %}
<!-- If incomplete leave it unchecked. -->
<div><input type="checkbox">Todo Detail</div>
{% endfor %}
至于受保护的检查checkboxes
,请查看此链接以查看适合您的内容。
希望这能让你走上正确的轨道。
推荐阅读
- r - R:如果日期差小于 7,则按组从前一行添加值
- java - 在 setItems() 之后无法在表格视图中查看单元格中的数据
- codeigniter - 错误链接到带有 href 的另一个页面(我的 localhost url 中的 %E2%80%8B 代码出错)
- c# - 可以从应用程序中删除“政策后参考”吗?
- r - 如何在 R 的系统命令中运行“conda ***”
- jpa - Spring JPA DDL 文件生成 - 如何在生成之前删除或清理文件
- sql - ORACLE - 问题理解不存在运算符
- typescript - 重载方法在 Typescript 中引发重复错误
- r - 将动画中的背景图像和线条着色与 ggplot2 和 gganimate 对齐
- c - C:在字符串中查找特定字符