воскресенье, 31 марта 2013 г.

Передаем в шаблон переменные из class based view

Пусть у нас есть class based view для отображения списка статей. Данное представление размещено в файле views.py:

from django.views.generic import DetailView, ListView
from article.models import Article


class ArticleListView(ListView):

    model = Article

    def get_queryset(self):

        tag = self.kwargs['tag']
        return Article.objects.filter(tag__tag_url=tag)


    def get_context_data(self, *args, **kwargs):

        context = super(ArticleListView, self).get_context_data(**kwargs)
        context['my_var'] = 'Это моя переменная'
        return context

Благодаря функции get_context_data(), можно передать в шаблон дополнительные переменные.
В этом примере в шаблоне окажется доступна переменная my_var, которую в шаблоне можно получить так: {{ my_var }}

Получить параметр из url в Class Based View

Хотите, чтобы у вас происходило следующее?
url: /article/php - в class based view получаем параметр php
url: /article/python - в class based view получаем параметр python

Для этого вы должны определить паттерн в urls.py:
url(r'^aticle/(?P<category>[a-z]+)/$', ArticleListView.as_view()),
Согласно этому паттерну, получается, что если обратиться по адресу /article/php, то будет задействовано представление ArticleListView, основанное на классе (это class based view).
Данный класс размещен в views.py:

from django.views.generic import DetailView, ListView
from article.models import Article


class ArticleListView(ListView):

    model = Article

    def get_queryset(self):

        category_url = self.kwargs['category']

        return Article.objects.filter(category=category_url)

В этом классе мы из url получаем параметр category посредством self.kwargs['category']. Затем мы достаем все статьи и отбираем из них те, где категория соответствует параметру category, полученному из url.
Работая с class based views, следует помнить об этой замечательной функции def get_queryset(self): Она позволяет определить содержание параметров, передаваемых в шаблон.

воскресенье, 24 марта 2013 г.

Обход элементов словаря python

Напишите на python функцию, которая позволяет преобразовать словарь в строки, выводимые в консоль как показано в двух примерах:

dict1 = {'a':1, 'b':{'aa':11, 'bb':22}, 'c':3}

Результат: 
[a]=1
[b][aa]=11
[b][bb]=22
[c]=3

   
dict2 = {'a':1, 'b':{'aa':11, 'bb':22, 'cc':{'aaa':111, 'bbb':222, 'ccc':333}, 'dd':44}, 'c':3}

Результат:
[a]=1
[b][aa]=11
[b][bb]=22
[b][cc][aaa]=111
[b][cc][bbb]=222
[b][cc][ccc]=333
[b][dd]=44
[c]=3