Django — общий вид с подклассами — параметры URL

Мне нужно отобразить страницу сведений о видео с некоторыми другими данными. Для этого я использую DetailView, который я переопределил, чтобы добавить некоторые переменные в контекст.

Вот части кода:

#urlconf
#...
  (r'viewtube/(?P<pk>\d+)$', VideoFileDetailView.as_view()),
#...

#view
class VideoFileDetailView(DetailView):
  model = VideoFile
  def get_context_data(self, **kwargs):
    context = super(VideoFileDetailView, self).get_context_data(**kwargs)
#    context['rates'] = VideoRate.objects.filter(video=11, user=1)
    return context

Здесь pk — это идентификатор видео, мне нужно получить оценки выбранного видео текущим пользователем.


person Pierre de LESPINAY    schedule 21.06.2011    source источник


Ответы (2)


Было бы полезно показать модели. Но я думаю, вам нужно переопределить get(), а не get_context_data, так как, к сожалению, последний не передает запрос, который вам нужен для получения пользователя. Так:

def get(self, request, **kwargs):
    self.object = self.get_object()
    context = self.get_context_data(object=self.object)
    context['rates'] = VideoRate.objects.filter(video=self.object, user=request.user)
    return self.render_to_response(context)
person Daniel Roseman    schedule 21.06.2011
comment
По-видимому, от get_context_data() мы можем получить запрос через self.request, спасибо, с этим все работает. - person Pierre de LESPINAY; 22.06.2011

Запрос должен быть доступен по адресу self.request. self.request устанавливается в начале запроса (в View.dispatch) и должен быть доступен любому из методов подкласса.

class VideoFileDetailView(DetailView):
  model = VideoFile
  def get_context_data(self, **kwargs):
    context = super(VideoFileDetailView, self).get_context_data(**kwargs)
    context['rates'] = VideoRate.objects.filter(video=11, self.request.user)
    # note that the object is available via self.object or kwargs.get("object")
    return context
person Yuji 'Tomita' Tomita    schedule 21.06.2011
comment
Мне также нужно было отфильтровать сам VideoFile, поэтому с video=self.object я получаю то, что ищу. - person Pierre de LESPINAY; 22.06.2011
comment
Спасибо Юджи. Я мало экспериментировал с представлениями на основе классов и был немного удивлен, что request не было явно передано в get_context_data. - person Daniel Roseman; 22.06.2011
comment
Хм ты прав! Это немного более волшебно, чем я привык при просмотре кода. Ну новинка ;) - person Yuji 'Tomita' Tomita; 22.06.2011