URL-parameters and logic in Django class-based views (TemplateView) URL-parameters and logic in Django class-based views (TemplateView) python python

URL-parameters and logic in Django class-based views (TemplateView)


To access the url parameters in class based views, use self.args or self.kwargs so you would access it by doing self.kwargs['year']


In case you pass URL parameter like this:

http://<my_url>/?order_by=created

You can access it in class based view by using self.request.GET (its not presented in self.args nor in self.kwargs):

from django.views.generic.list import ListViewclass MyClassBasedView(ListView):    ...    def get_queryset(self):        order_by = self.request.GET.get('order_by') or '-created'        qs = super().get_queryset()        return qs.order_by(order_by)


I found this elegant solution, and for django 1.5 or higher, as pointed out here:

Django’s generic class based views now automatically include a view variable in the context. This variable points at your view object.

In your views.py:

from django.views.generic.base import TemplateView    class Yearly(TemplateView):    template_name = "calendars/yearly.html"    # Not here     current_year = datetime.datetime.now().year    current_month = datetime.datetime.now().month    # dispatch is called when the class instance loads    def dispatch(self, request, *args, **kwargs):        self.year = kwargs.get('year', "any_default")    # other code    # needed to have an HttpResponse    return super(Yearly, self).dispatch(request, *args, **kwargs)

The dispatch solution found in this question.
As the view is already passed within Template context, you don't really need to worry about it. In your template file yearly.html, it is possible to access those view attributes simply by:

{{ view.year }}{{ view.current_year }}{{ view.current_month }}

You can keep your urlconf as it is.

It's worth mentioning that getting information into your template’s context overwrites the get_context_data(), so it is somehow breaking the django's action bean flow.