Задать вопрос
  • Работа с классом RedirectView в Django 1.10, не вызывается метод get_redirect_url()?

    beugene
    @beugene Автор вопроса
    Oracle Developer, Delphi, Python, Django
    Как оказалось нужно было правильно установить атрибут permanent класса RedirectView.
    При установке в False сервер посылает код 302, а при True - код 301.
    Значение этого атрибута влияет на то, откуда броузер берет данные - от сервера или из кэша.

    class AwardMemberStoreAwardPageView(RedirectView):
        permanent = False
    Ответ написан
    Комментировать
  • Возможно ли в шаблоне использовать косвенное обращение к переменной контекста?

    beugene
    @beugene Автор вопроса
    Oracle Developer, Delphi, Python, Django
    @Anatoly Scherbakov
    Идею понял. Спасибо за ответ.
    [[
    ProfileUserSection.objects.filter(user=user, section=section).annotate(count_сriterions=Count('сriterions')) for section in sections
    ] for user in users]

    Хочу написать свое решение и еще раз поблагодарить Анатолия за верное направление в решении.
    Ответ на вопрос: косвенная адресация недоступна и ненужна. SQL - решение в лоб. В django есть средства для красивого решения.

    Итак:
    views.py
    # coding: utf-8
    from django.shortcuts import render
    
    # Create your views here.
    def report(request, project_id="1")
        project = Project.objects.get(pk=project_id)
        # Получить список пользователей проекта
        users_list = list(ProjectProfileUser.objects.filter(project=project_id))
        # Получить список категорий проекта
        sections_list = list(project.sections.all())
        # Получить итоги (кол-во критериев на пересечении пользователя и категории) + совместить с информацией по пользователю
        result_list = [list(map(lambda x: list(x), ProfileUser.objects.filter(project=project_id, projectprofileuser=user).values_list(
            'user__id', 'user__first_name', 'user__last_name'))) +
                       [ProfileUserSection.objects.filter(section=section,
                                                          project_profile_user=user).aggregate(
                                                          count_criterions=Count('criterions'))['count_criterions']
                        for section in sections_list] for user in users_list]
        # print('res=', result_list)
        context = {'project': project,
                   'result_list': result_list,
                   'rows_count': len(result_list),
                   }
        template = 'report.html'
        return render(request, template, context)


    report.html
    ...
           <table class="table">
                <thead>
                    <tr>
                        <td></td>
                        <td></td>
                        <td></td>
                        <td></td>
                        <td></td>
                        <td align="center" colspan="{{ project.sections.all.count }}"><b>{% trans 'Категория' %}</b></td>
                    </tr>
                    <tr>
                       <td><b>{% trans 'ID' %}</b></td>
                       <td><b>{% trans 'Фамилия' %}</b></td>
                       <td><b>{% trans 'Имя' %}</b></td>
                       {% for section in project.sections.all %}
                           <td align="center"><b>'{{ section.caption }}'</b></td>
                       {% endfor %}
                    </tr>
                </thead>
                <tbody>
                {% for row in result_list %}
                    <tr>
                    {% for item in row %}
                        {% if forloop.counter == 1 %}
                            {% for cell in item %}
                                <td>{{ cell }}</td>
                            {% endfor %}
                        {% else %}
                            <td align="center">{{ item }}</td>
                        {% endif %}
                    {% endfor %}
                    </tr>
                {% endfor %}
                </tbody>
            </table>
    ...
    Ответ написан
    Комментировать