#django #django-views #django-templates #django-urls #django-template-filters
#django #django-представления #django-шаблоны #django-urls #django-template-filters
Вопрос:
Возможно ли выполнить итерацию по списку из трех контекстных переменных, показанных ниже, чтобы в зависимости от атрибута пользователя (в данном случае grade, Grade 10, Grade 11, Grade 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-адреса для каждого контекста, который, в свою очередь, отображает другой шаблон, но это не кажется эффективным, и я надеюсь, что есть лучший способ сделать это. Любая помощь приветствуется, включая указатели на документацию.
Ответ №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
в вашем шаблоне
Комментарии:
1. спасибо, это определенно гораздо лучший подход к тому, что я имел в виду. Однако мне нужно будет внести дополнительные изменения в пользователя по умолчанию, чтобы включить также оценку, которая в настоящее время привязана к нему через модель профиля.