1

I'm trying to implement a more generic version of the Django class based detail view, which can operate on different models when required. The idea was to set the model using a parameter in the URL, like so:

url(r'^product/view/(?P<bought_in_control_panel_id>\d+)/(?P<item_uuid>'+uuid_re+'/)',
    GenericModelDetailView().as_view(pk_url_kwarg='item_uuid',
                                     template_name='suppliers/products/view_product.html')
    , name='view_product'),

This is the class that i'm using, but django is complaining about the class not having an object attribute.

class GenericModelDetailView(DetailView):

    def __init__(self, *args, **kwargs):
        self.model = get_model_for_bought_in_control_panel(super(GenericModelDetailView, self).get_context_data(**kwargs)['bought_in_control_panel_id'])
        super(GenericModelDetailView, self).__init__(**kwargs)

Stacktrace:

  File "django/core/handlers/base.py", line 89, in get_response
    response = middleware_method(request)
  File "django/middleware/common.py", line 67, in process_request
    if (not _is_valid_path(request.path_info, urlconf) and
  File "django/middleware/common.py", line 154, in _is_valid_path
    urlresolvers.resolve(path, urlconf)
  File "django/core/urlresolvers.py", line 342, in resolve
    return get_resolver(urlconf).resolve(path)
  File "django/core/urlresolvers.py", line 252, in resolve
    sub_match = pattern.resolve(new_path)
  File "django/core/urlresolvers.py", line 250, in resolve
    for pattern in self.url_patterns:
  File "django/core/urlresolvers.py", line 279, in _get_url_patterns
    patterns = getattr(self.urlconf_module, "urlpatterns", self.urlconf_module)
  File "django/core/urlresolvers.py", line 274, in _get_urlconf_module
    self._urlconf_module = import_module(self.urlconf_name)
  File "django/utils/importlib.py", line 35, in import_module
    __import__(name)
  File "/home/jsoft/jmsdirectory/srv/jmsdirectory/../jmsdirectory/suppliers/urls.py", line 29, in <module>
    GenericModelDetailView().as_view(pk_url_kwarg='item_uuid',
  File "jmsdirectory/suppliers/products.py", line 79, in __init__
    self.model = get_model_for_bought_in_control_panel(super(GenericModelDetailView, self).get_context_data(**kwargs)['bought_in_control_panel_id'])
  File "django/views/generic/detail.py", line 90, in get_context_data
    context_object_name = self.get_context_object_name(self.object)
Jharwood
  • 1,046
  • 2
  • 11
  • 28
  • A DetailView can operate with any model, that's what it is designed for. What is your get_model_for_bought_in_control_panel doing? – Jay Jun 24 '13 at 19:25
  • it takes in a bought_in_control_panel_id and then returns the respective model instance, be it a Fitting, Glass, Timber, etc – Jharwood Jun 25 '13 at 08:00

0 Answers0