Search code examples
djangoadmin

is it possible to create a custom admin view without a model behind it


I have an object which I want to use under admin instead of a model which inherits models.Model. If I make it inherit models.Model, this object will create a table in the database which i don't want. I only want this object to stay in memory.

One solution I have come with help from the nice people at stack overflow is I create admin views, register these custom views via a modelAdmin ( admin.site.register() ) under admin.py and use this model-like object as dynamic data storage (in memory).

Since this model like object doesn't inherit from models.Model, admin.site.register() (under admin.py) doesnt accept it and shows a 'type' object is not iterable" error when I try to access it in the browser.


Solution

  • hmmm. Thanks for your help everyone. The solution I have come up ( with your help ofcourse :) is as follows:

    I have two custom templates:

       my_model_list.html
       my_model_detail.html
    

    Under views.py:

    class MyModel(object):
        # ... Access other models
        # ... process / normalise data 
        # ... store data
    
    @staff_member_required
    def my_model_list_view(request) #show list of all objects
        #. . . create objects of MyModel . . .
        #. . . call their processing methods . . .
        #. . . store in context variable . . . 
        r = render_to_response('admin/myapp/my_model_list.html', context, RequestContext(request))
        return HttpResponse(r)
    
    @staff_member_required
    def my_model_detail_view(request, row_id) # Shows one row (all values in the object) in detail     
        #. . . create object of MyModel . . .
        #. . . call it's methods . . .
        #. . . store in context variable . . . 
        r = render_to_response('admin/myapp/my_model_detail.html', context, RequestContext(request))
        return HttpResponse(r)
    

    Under the main django urls.py:

    urlpatterns = patterns( 
        '',
        (r'^admin/myapp/mymodel/$', my_model_list_view),
        (r'^admin/myapp/mymodel/(\d+)/$', my_model_detail_view),
        ( r'^admin/', include( admin.site.urls ) )
    )