Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Django: Extend context of class based view with Admin context

Tags:

python

django

I have a class based view which just displays a list of configurations.

This view is added to the Django Admin site by using the following code:

@admin.register(ZbxHostConf)
class ZbxHostConfListViewAdmin(admin.ModelAdmin):
    review_template = 'admin/admzbxhostconf_list.html'

    def get_urls(self):
        urls = super(ZbxHostConfListViewAdmin, self).get_urls()
        my_urls = patterns('',
                           (r'^zbxhostconflist/$', self.admin_site.admin_view(self.review)),
                           )
        return my_urls + urls


    def review(self, request):
        return ZbxHostConfListView.as_view()(request)

The template extends the admin/base_site.html template. I can access the site only after I log in to the Django Admin site. Unfortunately the template cannot access the context data provided by the admin view.

As the Django documentation suggests the context data will be provided directly to the TemplateResponse function:

  def my_view(self, request):
        # ...
        context = dict(
           # Include common variables for rendering the admin template.
           self.admin_site.each_context(request),
           # Anything else you want in the context...
           key=value,
        )
        return TemplateResponse(request, "sometemplate.html", context)

For function-based views there is the possibility of the extra_context argument but class-based views don't provide this argument. I guess I have to modify the get_context_data function but I don't really understand how I can provide the admin context data to the get_context_data function of my class based view. Any suggestions?

like image 364
Philipp Wiesner Avatar asked May 06 '15 14:05

Philipp Wiesner


People also ask

How do I add context to a class in Django?

How to Pass Additional Context into a Class Based View (Django)? Passing context into your templates from class-based views is easy once you know what to look out for. There are two ways to do it – one involves get_context_data, the other is by modifying the extra_context variable.

How to pass additional context into a class based view(Django)?

How to Pass Additional Context into a Class Based View (Django)? Passing context into your templates from class-based views is easy once you know what to look out for. There are two ways to do it – one involves get_context_data, the other is by modifying the extra_context variable. Let see how to use both the methods one by one.

What are class-based views in Django?

For full details, see the class-based views reference documentation. Django provides base view classes which will suit a wide range of applications. All views inherit from the View class, which handles linking the view into the URLs, HTTP method dispatching and other common features.

What is singleobjecttemplateresponsemixin in Django?

SingleObjectMixin also overrides get_context_data () , which is used across all Django’s built in class-based views to supply context data for template renders. To then make a TemplateResponse , DetailView uses SingleObjectTemplateResponseMixin , which extends TemplateResponseMixin , overriding get_template_names () as discussed above.


1 Answers

This might not be a correct answer, but I believed you could try something like this.

#!/usr/bin/python3

from django.contrib import admin

class MyTemplateView(TemplateView):
    def get_context_data(self, **kwargs):    
        context = super().get_context_data(**kwargs)
        context.update(admin.site.each_context(self.request))
        return context
like image 68
Yeo Avatar answered Nov 14 '22 21:11

Yeo