Django过滤并在模板中显示(如果存在对象) [英] Django filter and display in template if object exists

查看:45
本文介绍了Django过滤并在模板中显示(如果存在对象)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

models.py:

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 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

我的views.py:

My views.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> &nbsp;
 {{ 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是模型表单.具有模型作为Task

StudentTaskForm is a model form .Has model as Task

我有3个模型.待办事项,级别和任务.每个级别包含许多待办事项".任务基本上完成了待办事项.因此,如果待办事项已完成,则将其另存为任务.我想如果待办事项"已经完成,即如果此待办事项"另存为任务,则显示待办事项"列表中的复选图标.仅在完成此待办事项后,才应显示"fas fa-check"类的图标.待办事项"显示为列表.在模板中,级别作为任务"传递...因此,该级别中的所有待办事项"都由task.todo_set.all ...来拉取.所有完成的待办事项都要检查

I have 3 models. Todo, Level, and Task. Each Level contains many 'todos'. Tasks are basically completed todos. So if a todo is completed, it is saved as a Task. I want the check icon in the 'todo' list be displayed if 'todo' is already completed, that is if this 'todo' is saved as a task. The icon with class "fas fa-check" specifically should be displayed only if this todo is completed. The 'todos' are displayed as a list. In the template, the Level is passed as 'task'... So all the 'todos' in the level are pulled by task.todo_set.all... I want the 'todos' that are also in the Task which is basically all the completed todos to have the check

推荐答案

  tasks = Task.objects.filter(student=request.user,level=instance).only("todo")
  list=[]
  for task in tasks:
     list.append(task.todo)

这对我有用.我将所有 todos 从已过滤的 tasks 添加到 list ,然后将此列表传递给 template .然后我只需要比较

This worked for me. I add all todos from the filtered tasks to a list and then pass this list to the template. Then I just had to compare

 {% if obj in list %}
  #display check
 {% endif %}

这篇关于Django过滤并在模板中显示(如果存在对象)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆