Форум программистов, компьютерный форум, киберфорум
Python: Django
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
1 / 1 / 2
Регистрация: 12.07.2013
Сообщений: 144
1

Django как добавить СЛОВАРЬ в свой(или во вьюшкин) контекст?

30.06.2017, 19:15. Показов 2527. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
собсно. Django 1.10
Хочу "обсчитать" некоторые штуки по моделям и использовать их в шаблонах, но так чтобы
обсчеты были не в каждой вьюхе и затем добавлялись в контекст данной вьюхи, а централизованно:
создать свой контекст, все там сосчитать, и пользоваться.

создал контекст:
context_processors.py в папке апы tasklist

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
from .models import TaskList, Task
 
 
def tasklist_context(request):
    tl_context = dict()
    tls = TaskList.objects.all()
    for tl in tls:
        complete_task_nmb = Task.filter(tasklist=tl, status=True).count()
        uncomplete_task_nmb = Task.filter(tasklist=tl, status=False).count()
        tl_context[tl.id] = {'ctn': complete_task_nmb, 'utn': uncomplete_task_nmb}
 
    return {'tl_context': tl_context}
    # return {tl_context} - а если так - то как потом обращаться?
добавил его в setting.py:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')]
        ,
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.template.context_processors.media',
                'django.contrib.messages.context_processors.messages',
                'tasklist.context_processors.tasklist_context',
            ],
        },
    },
]
по идее должен увидеть в шаблоне хотя бы "имя" - {{tl_context}} но нету его...
Как сделать?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.06.2017, 19:15
Ответы с готовыми решениями:

Как лучше добавить в словарь другой словарь?
Добрый день! Как лучше добавить вложенный словарь new_dict в stat_obj? data = {'stat_obj':''} ...

Как добавить свой текст в конец или начало зашифрованного файла?
using System; using System.IO; using System.Security.Cryptography; using System.Text; public...

Мульти словарь или как генерировать словарь в словаре
Добрый день. Есть большое количество данных, которое на хочется перебирать, и появилась проблема: ...

Как создать свой словарь
помогите создать свой словарь на любой язык. спс

Как опубликовать свой сайт на Django, в интернете?
Как опубликовать свой сайт на Django 3 , в интернете? Где почитать про это можно?

3
145 / 113 / 31
Регистрация: 12.06.2011
Сообщений: 1,242
01.07.2017, 11:19 2
Дебажить надо. Проверить, кидал ли ты контекст в шаблон. Поставь точку останова на 12-й строчке и посмотри, что там.
0
Просто Лис
Эксперт Python
5731 / 3530 / 1055
Регистрация: 17.05.2012
Сообщений: 10,360
Записей в блоге: 9
01.07.2017, 11:52 3
Контекст-процессор:
Python
1
2
3
4
5
6
7
def tasklist_context(request):
    tl_context = {}
    tls = TaskList.objects.all()
    for tl in tls:
        tl.complete_task_nmb = Task.filter(tasklist=tl, status=True).count()
        tl.uncomplete_task_nmb = Task.filter(tasklist=tl, status=False).count()
    return {'tl_context': tl_context}
В шаблоне:
HTML5
1
2
3
{% for i in tl_context }
  {{i.complete_task_nmb}}
{% endfor %}
Добавлено через 1 минуту
Цитата Сообщение от Kifsif Посмотреть сообщение
Проверить, кидал ли ты контекст в шаблон.
Контекст процессоры применяются при вызове функции render. А так вы правы, за контекст-процессорами нужно следить.
0
1 / 1 / 2
Регистрация: 12.07.2013
Сообщений: 144
01.07.2017, 13:57  [ТС] 4
не, кароче так не взлетело вообще.
значение переменной контекста(да и ключ наверное тоже) должно быть Hashable, передать словарь нельзя.Только простые хэшируемые типы.
Сделал по методе...

в модели Tasklist написал два self-метода:

Python
1
2
3
4
5
6
7
8
class TaskList(models.Model):
   ...
   ...
    def get_complete_task_number(self):
        return Task.objects.filter(tasklist=self, status=True)
 
    def get_uncomplete_task_number(self):
        return Task.objects.filter(tasklist=self, status=False)
Вьюшка у меня наследует от ListView, и стандартно предоставляет в контексте: object_list (которые и есть TaskList)
Python
1
class TaskListIndex(ListView, LoginRequiredMixin):
а в шаблоне просто вызываю методы объекта:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
{% for object in object_list %}
        <tr>
            <td>
                <a href="{% url "tasklist_detail" pk=object.pk %}?page={{ page_obj.number }}">{{ object.title }}</a>
            </td>
            <td>
                <p> {{object.get_complete_task_number.count}}</p>
            </td>
            <td>
                <p> {{object.get_uncomplete_task_number.count}}</p>
            </td>
...
...
А со словарем не получилось...но было бы интересно...

Хотел еще переменные контекста в цикле делать(работает,но бестолку - в шаблоне их никак не распознать в цикле), во вьюхе делал такое:

Python
1
2
3
4
5
6
7
8
9
10
11
12
    def get_context_data(self, *args, **kwargs):
 
        context = super(TaskListIndex, self).get_context_data(**kwargs)
        context['user'] = self.request.user.is_authenticated
        
        tls = TaskList.objects.filter(user=self.request.user)
        
        for tl in tls:
            context[str(tl.id)+'ctn'] = Task.objects.filter(tasklist=tl, status=True)
            context[str(tl.id)+'utn'] = Task.objects.filter(tasklist=tl, status=False)
            
        return context
но как в шаблоне потом обращаться к таким ключам-переменным? 23ctn, 23utn И.т.п, там же выражение с str(object.id) не написать...а вот со словарем было бы удобно, что то вроде:
{{ Tasklist_context[obgect.id][0]}} - это было бы ctn нужной записи
{{ Tasklist_context[obgect.id][1]}} - а это utn

Добавлено через 14 минут
точнее так:
{{ Tasklist_context[obgect.id][0]['ctn']}}
{{ Tasklist_context[obgect.id][1]['utn']}}
0
01.07.2017, 13:57
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.07.2017, 13:57
Помогаю со студенческими работами здесь

Как добавить данные в БД Django
Делаю книжный веб-магазин. В магазине есть лента, где пользователь выбирает книгу, нажимает на нее,...

Словарь с большой вложенностью в Django
Здравствуйте. Изучаю Django самостоятельно. Возник вопрос. Допустим, есть словарь: content =...

Как добавить объекты в словарь из консоли
Возможно ли добавить новые объекты в Dictionary из консоли?

Как добавить слово в Словарь (Word)
Вопрос в теме.

Не пойму как добавить элемент в словарь
Вот у меня есть словарь и он состоит из девяти команд у которых есть определённые баллы,и надо...

Как добавить колекцию SortedSet в словарь
Dictionary&lt;string, SortedSet&lt;DateTime&gt;&gt;test= new Dictionary&lt;string, SortedSet&lt;DateTime&gt;&gt;();...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru