Форум программистов, компьютерный форум, киберфорум
Python: Django
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/8: Рейтинг темы: голосов - 8, средняя оценка - 5.00
0 / 0 / 2
Регистрация: 12.07.2013
Сообщений: 141
1

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

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

собсно. 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
Ответы с готовыми решениями:

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

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

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

Как добавить изображение в модель Django?
Как добавить изображение в модель Django? Если я в модели добавляю: image =...

3
130 / 103 / 29
Регистрация: 12.06.2011
Сообщений: 1,129
01.07.2017, 11:19 2
Дебажить надо. Проверить, кидал ли ты контекст в шаблон. Поставь точку останова на 12-й строчке и посмотри, что там.
0
Просто Лис
Эксперт Python
4410 / 2807 / 929
Регистрация: 17.05.2012
Сообщений: 8,190
Записей в блоге: 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
0 / 0 / 2
Регистрация: 12.07.2013
Сообщений: 141
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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.07.2017, 13:57

Как добавить сортировку по алфавиту в частотный словарь?
Есть код, который выводит слова в порядке убывания частоты их появления. Как его изменить чтоб...

Как добавить ключ и несколько элементов в словарь?
Нужно добавить элементы в словарь, ключ и элементы не знаем до ввода. Вот код: #include...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru