Ошибка при использовании self.request (NameError)
У меня есть view класс который отслеживает метод запроса(через self.request.method), однако Python ругается на этот код и выбрасывает ошибку.
Возможно, нужно унаследовать переменную request через метод super из наследуемого класса DetailView в методе __init__ но как это сделать я не понять и найти в интернете.
Упрощенный view.py (только класс):
class ParticularBook(DetailView):
message = ''
template_name = 'bookapp/book_info.html'
context_object_name = 'book'
if self.request.method == 'POST':
create_comment(self.request, ParticularBook())
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['book_author'] = Autor.objects.get(author_full_name=self.get_object().book_autor)
context['message'] = self.message
return context
def get_object(self):
return get_object_or_404(Book, pk=self.kwargs.get('pk'))
def set_message(self, msg):
self.message = msg
Ответы (1 шт):
Дело в особенности логики классов в python - весь код, который должен выполняться, обязан находится в методах, реализованных внутри конкретного класса, в данном случае класс ParticularBook, остается понять как сделать такой метод, что-бы при обработки url post запроса он выполнялся.
На помощь приходит метод post который можно несложно реализовать( а еще применяются такие методы как get, head и т.д.). Также, стоит уточнить откуда берется вообще этот post и почему. Дело в том что все, так называемые class-based отображения, наследуют главный, родительский класс именуемый View именно благодаря ему можно реализовывать функционал, подобный данному случаю. (см. dispatch)
Ну, собственно говоря вот измененный класс до правильного состояния:
class ParticularBook(DetailView):
message = ''
template_name = 'bookapp/book_info.html'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['book_author'] = Autor.objects.get(author_full_name=self.get_object().book_autor)
context['message'] = self.message
return context
def get_object(self):
return get_object_or_404(Book, pk=self.kwargs.get('pk'))
def set_message(self, msg):
self.message = msg
def post(self, request, pk, *args, **kwargs):
self.message = create_comment(request, self.get_object())
# context = super().get_context_data(**kwargs)
context = {}
context['book_author'] = Autor.objects.get(author_full_name=self.get_object().book_autor)
context['message'] = self.message
context['book'] = self.get_object()
return render(request, self.template_name, context)
