Как стать автором
Обновить

Комментарии 9

Но ведь никто не заставит переписывать свои view на CBV? :)
Никто не заставляет, но некоторые вещи можно будет упростить.
Я, например, переписал на CBV вьюхи в которых есть и GET и POST
def get() и def post() напомнило о webpy…
Спасибо большое за статьи, информации о class based views действительно немного. Да, переписывать уже имеющиеся вьюхи, скорее всего, не буду, но в новых проектах обязательно постараюсь использовать CBV. Раньше очень раздражала необходимость повторять одни и те же кусочки кода, чтобы создать интерфейс добавления/редактирования/удаления экземпляра — в итоге написал свой небольшой класс-прослойку, которым достаточно успешно пользуюсь — github
Не то что бы прям канонически правильный, но всё же неплохой пример того, как CBV может облегчить жизнь: github.com/lig/django-supergeneric/
Хм… очень странно, но у меня ваш пример

class PostDetail(DetailView):

model = Post

def get(self, request, **kwargs):
return self.render_to_response(self.get_context_data(), **kwargs)

Вызывает странную ошибку «object has no attribute 'object'»

/usr/local/lib/python2.7/dist-packages/django/views/generic/detail.py in get_context_data
context_object_name = self.get_context_object_name(self.object)

Ни как не могу понять почему в этом случае не вызывается метод get_object, специально его определил, указал модель, но ошибку так и не победил. =(
Разобрался
1. В методах get, post,… etc.
надо перед self.get_context_data() всегда делать вот такую ерунду
self.object = self.get_object() # мне это с самого начала показалось идиотизмом, но тут
/usr/local/lib/python2.7/dist-packages/django/views/generic/detail.py (BaseDetailView-->get) я нашёл подтверждение

2. Вместо
return self.render_to_response(self.get_context_data(), **kwargs)
должно быть
return self.render_to_response(self.get_context_data())
Для меня за кулисам остались две вещи:

1. Как с помощью базовых классов передавать связанные объекты. Например, нужно получить список всех постов, принадлежащих выбранной категории.

class CategoriesList(ListView):

    model = Post

    def get_context_data(self, **kwargs):
        context = super(CategoriesList, self).get_context_data(**kwargs)
        select_post = Category.objects.get(id=1)
        context['select_all_posts'] = select_post.tags.all()
        return context


Как получить id текущей категории вместо id=1?

2. Получение прямой ссылки на элементы контекста. Пример:

class PostDetailView(DetailView):

    ''' Show single news '''
    model = Post
    template_name = 'news/one_new.html'
    context_object_name = 'post'

def get_next(self):
.......

def get_prev(self):
.......

def get_context_data(self, **kwargs):
        context = super(PostDetailView, self).get_context_data(**kwargs)
        context['next'] = self.get_next()
        context['prev'] = self.get_prev()
        return context


В шаблоне выводим <a href="{{ next }} >Next</a>, в результате чего адрес текущей ссылки лишь дополняется именем следующего поста. Может, с помощью {% url %} как-то можно получить полный путь к next/prev?
некропостинг, конечно… но вдруг кому-то потом пригодится
1. Вообще не понятно, как Вы пытались выбранную категорию передать… и почему для класса CategoriesList в качестве модели Вы даёте Post
вариант а) нужно вывести список категорий и рядом с каждой — несколько постов
model=Category

контекст не переопределяем и в шаблоне делаем перебор всего в category_list, добираясь в тч до постов через .post_set.all
вариант б) нужно вывести список постов в той же категории, что и текущий
class PostDetailView(DetailView):
    model=Post

контекст опять же не переопределяем, а в шаблоне можно сходить в post.category.post_set.all
хотя можно это же сделать и переопределив контекст, сперва добравшись до нужных данных через self.get_object()
вариант в) нужно вывести список постов заданной категории
class CategoryDetailView(DetailView):
    model=Category

ну и далее в шаблоне также будет всё необходимое

2. Что-то вроде
{% url "post_detail_view" next.slug %}
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории