Комментарии 9
Но ведь никто не заставит переписывать свои view на CBV? :)
+2
def get() и def post() напомнило о webpy…
+1
Спасибо большое за статьи, информации о class based views действительно немного. Да, переписывать уже имеющиеся вьюхи, скорее всего, не буду, но в новых проектах обязательно постараюсь использовать CBV. Раньше очень раздражала необходимость повторять одни и те же кусочки кода, чтобы создать интерфейс добавления/редактирования/удаления экземпляра — в итоге написал свой небольшой класс-прослойку, которым достаточно успешно пользуюсь — github
+2
Не то что бы прям канонически правильный, но всё же неплохой пример того, как CBV может облегчить жизнь: github.com/lig/django-supergeneric/
+1
Хм… очень странно, но у меня ваш пример
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, специально его определил, указал модель, но ошибку так и не победил. =(
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, специально его определил, указал модель, но ошибку так и не победил. =(
0
Разобрался
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. В методах 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())
0
Для меня за кулисам остались две вещи:
1. Как с помощью базовых классов передавать связанные объекты. Например, нужно получить список всех постов, принадлежащих выбранной категории.
Как получить id текущей категории вместо id=1?
2. Получение прямой ссылки на элементы контекста. Пример:
В шаблоне выводим
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?0
некропостинг, конечно… но вдруг кому-то потом пригодится
1. Вообще не понятно, как Вы пытались выбранную категорию передать… и почему для класса CategoriesList в качестве модели Вы даёте Post
вариант а) нужно вывести список категорий и рядом с каждой — несколько постов
контекст не переопределяем и в шаблоне делаем перебор всего в category_list, добираясь в тч до постов через .post_set.all
вариант б) нужно вывести список постов в той же категории, что и текущий
контекст опять же не переопределяем, а в шаблоне можно сходить в post.category.post_set.all
хотя можно это же сделать и переопределив контекст, сперва добравшись до нужных данных через self.get_object()
вариант в) нужно вывести список постов заданной категории
ну и далее в шаблоне также будет всё необходимое
2. Что-то вроде
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 %}
0
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Немного подробностей про Class Based View, ч.2