根据用户的属性在 Django 模板中迭代上下文变量
Iterate context variables in Django templates based on user's attributes
是否可以根据用户的属性(在本例中为 10 年级、11 年级、12 年级)迭代下面显示的三个上下文变量的列表。如果当前用户的等级属性是 Grade 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,这反过来会呈现不同的模板,但这似乎效率不高,我希望有更好的方法来做到这一点。非常感谢任何帮助,包括文档指针。
您可以在您的视图中执行此逻辑,您可以使用单个上下文变量但根据您的逻辑更改其内容
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
是否可以根据用户的属性(在本例中为 10 年级、11 年级、12 年级)迭代下面显示的三个上下文变量的列表。如果当前用户的等级属性是 Grade 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,这反过来会呈现不同的模板,但这似乎效率不高,我希望有更好的方法来做到这一点。非常感谢任何帮助,包括文档指针。
您可以在您的视图中执行此逻辑,您可以使用单个上下文变量但根据您的逻辑更改其内容
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