根据用户的属性迭代 Django 模板中的上下文变量

Posted

技术标签:

【中文标题】根据用户的属性迭代 Django 模板中的上下文变量【英文标题】:Iterate context variables in Django templates based on user's attributes 【发布时间】:2021-03-30 05:08:26 【问题描述】:

是否可以遍历下面显示的三个上下文变量的列表,以便根据用户的属性(在本例中为 10 年级、11 年级、12 年级)。如果当前用户的等级属性是 10 年级,那么他们只能从下面得到:context['grade10']。

当前视图:

class SumListView(ListView):
    model = Summaries
    template_name = 'exam/summary.html'

def get_context_data(self, **kwargs):
    context = super().get_context_data(**kwargs)
    context['grade10'] = Summary.objects.filter(grade='Grade 10')
    context['grade11'] = Summary.objects.filter(grade='Grade 11')
    context['grade12'] = Summary.objects.filter(grade='Grade 12')
    return context'''

当前 html 模板块:

           % block content %
  
               % for summary in grade10 %
                   <div class="container>
                       summary.content 
                   </div>
               % endfor %
 
          % endblock content %
 

我试过了,但它破坏了代码,因为 for 循环和迭代混合在一起:

% block content %
     % if grade10 %
       % for summary in grade10 %
          <div class="container>
              summary.content 
          </div>
         % endfor %
     % elif grade11 %
         % for summary in grade10 %
          <div class="container>
              summary.content 
          </div>
          % endfor %
     % else grade12 %
         % for summary in grade10 %
          <div class="container>
              summary.content 
          </div>
         % endfor %
     % enif %
% endblock content %

最好的方法是什么?

我知道我可以为每个上下文编写不同的 url,从而呈现不同的模板,但这似乎效率不高,我希望有更好的方法来做到这一点。任何帮助都非常感谢,包括文档指针。

【问题讨论】:

【参考方案1】:

您可以在视图中执行此逻辑,您可以使用单个上下文变量,但根据您的逻辑更改其内容

def get_context_data(self, **kwargs):
    context = super().get_context_data(**kwargs)
    user_grade = self.request.user.get_grade() # Replace with how you access the user's grade
    context['grades'] = Summary.objects.filter(grade=user_grade)
    return context

然后在你的模板中循环grades

【讨论】:

谢谢,对于我的想法,这绝对是一个更好的方法。但是,我需要对默认用户进行进一步的更改,以便包括当前通过配置文件模型附加到它的成绩。

以上是关于根据用户的属性迭代 Django 模板中的上下文变量的主要内容,如果未能解决你的问题,请参考以下文章

迭代 Django 模板中的一个 len 列表

如何在 django 中编译保存在数据库中的模板

Django Templates — 将模板中的变量值传递给 templatetags 过滤器

在 Django 模板中迭代 Expando 的动态属性

如何从 Django 模板中的页面迭代 cms 插件实例?

我可以访问 Django 模板列表中第一个对象的属性吗?