Each plugin should call super() on their own definition of the get_context_data method -- which will return a dictionary --, then update and return a modified dictionary.
There's no need to explicitly call each plugin by the name in subclasses. It works the other way around. Cheers, AT On Tue, Jan 10, 2012 at 4:55 AM, Roland van Laar <rol...@micite.net> wrote: > On 01/09/2012 10:36 PM, jrief wrote: > > Hi, > currently I am writing a Django applications built up from loosely coupled > plug-ins. Each of these plug-ins shall offer a class based view to handle > get and post requests. For get requests the context shall be populated with > plug-in specific data. For post requests, the plug-in specific posted data > shall be handled by the corresponding view class. > > This of course is not difficult to achieve. The view class of the final > app, which combines all these plugins, can overload the methods > get_context_data() and post() and dispatch the requests to functions > offered by these plug-ins. But I do not like this approach because it does > not separate concerns and the author of the final app has to remember, how > to dispatch these requests manually to the plug-ins. > > > Is there a way to know which plugin is needed? > > > My question is, if there is there a more elegant solution, say a > pattern, which does not require to duplicate the dispatching code for the > mixin classes? > > Let me explain using some sample code: > > class MainAppDetailView(SomeBaseDetailView, PluginAMixin, PluginBMixin): > model = MyModel > template_name = "my_detail.html" > > def get_context_data(self, **kwargs): > context = super(FinalAppDetailView, > self).get_context_data(**kwargs) > PluginAMixin(self).update_context(context) > PluginBMixin(self).update_context(context) > return context > > def post(self, *args, **kwargs): > post_request = self.request.POST > > Instead of: > > response = PluginAMixin(self).handle_post(post_request) > if issubclass(response, HTTPResponse): > return response > response = PluginBMixin(self).handle_post(post_request) > if issubclass(response, HTTPResponse): > return response > > you could use: > > for plugin in (PluginAMixin, PluginBMixin): > response = super(plugin, self).handle_post(post_request) > > if issubclass(response, HTTPResponse): > return response > > > > # handle post request for the main app > ... > return response > > For my point of view this example contains too much code duplication. Is > there a pattern, so that I only have to modify the class declaration of my > FinalAppDetailView or even better, only in my settings.py? > > Cheers, Jacob > -- > > Roland > > -- > You received this message because you are subscribed to the Google Groups > "Django users" group. > To post to this group, send email to django-users@googlegroups.com. > To unsubscribe from this group, send email to > django-users+unsubscr...@googlegroups.com. > For more options, visit this group at > http://groups.google.com/group/django-users?hl=en. > -- You received this message because you are subscribed to the Google Groups "Django users" group. To post to this group, send email to django-users@googlegroups.com. To unsubscribe from this group, send email to django-users+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/django-users?hl=en.