Pierre de LESPINAY
Pierre de LESPINAY

Reputation: 46198

Django - Generic View Subclassed - url Parameters

I need to display a detail page for a video with some other data. For that I use DetailView that I have overridden to add some variables to the context.

Here are the code parts:

#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

Here pk is the id of a video, I need to get the rates of the selected video by the current user.

Upvotes: 4

Views: 4322

Answers (2)

The request should be accessible at self.request. self.request is set at the beginning of the request (in View.dispatch) and should be available any of the subclass methods.

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

Upvotes: 4

Daniel Roseman
Daniel Roseman

Reputation: 599796

It would have been useful to show the models. But I think you need to override get(), not get_context_data, as unfortunately the latter doesn't get passed the request, which you need in order to get the user. So:

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)

Upvotes: 4

Related Questions