Итерация контекстных переменных в шаблонах Django на основе атрибутов пользователя

#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. спасибо, это определенно гораздо лучший подход к тому, что я имел в виду. Однако мне нужно будет внести дополнительные изменения в пользователя по умолчанию, чтобы включить также оценку, которая в настоящее время привязана к нему через модель профиля.