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

前端 未结 5 944
小蘑菇
小蘑菇 2020-11-28 22:32

It is unclear to me how it is best to access URL-parameters in class-based-views in Django 1.5.

Consider the following:

View:



        
相关标签:
5条回答
  • 2020-11-28 22:40

    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):

    class MyClassBasedView(ObjectList):
        ...
        def get_queryset(self):
            order_by = self.request.GET.get('order_by') or '-created'
            qs = super(MyClassBasedView, self).get_queryset()
            return qs.order_by(order_by)
    
    0 讨论(0)
  • 2020-11-28 22:47

    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.

    0 讨论(0)
  • 2020-11-28 22:53

    How about just use Python decorators to make this intelligible:

    class Yearly(TemplateView):
    
        @property
        def year(self):
           return self.kwargs['year']
    
    0 讨论(0)
  • 2020-11-28 22:57

    So far I've only been able to access these url parameters from within the get_queryset method, although I've only tried it with a ListView not a TemplateView. I'll use the url param to create an attribute on the object instance, then use that attribute in get_context_data to populate the context:

    class Yearly(TemplateView):
        template_name = "calendars/yearly.html"
    
        current_year = datetime.datetime.now().year
        current_month = datetime.datetime.now().month
    
        def get_queryset(self):
            self.year = self.kwargs['year']
            queryset = super(Yearly, self).get_queryset()
            return queryset
    
        def get_context_data(self, **kwargs):
            context = super(Yearly, self).get_context_data(**kwargs)
            context['current_year'] = self.current_year
            context['current_month'] = self.current_month
            context['year'] = self.year
            return context
    
    0 讨论(0)
  • 2020-11-28 23:02

    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']

    0 讨论(0)
提交回复
热议问题