2010-11-10 67 views
17

我有一個對象,我想在管理下使用而不是繼承models.Model的模型。如果我讓它繼承models.Model,這個對象將在數據庫中創建一個我不想要的表。我只想讓這個對象留在內存中。是否可以在沒有模型的情況下創建自定義管理視圖

一個解決方案我來自堆棧溢出的好人的幫助是我創建管理視圖,通過admin.py下的modelAdmin(admin.site.register())註冊這些自定義視圖,並使用此模型對象作爲動態數據存儲(在內存中)。

由於此模型像對象不會繼承models.Model,admin.site.register()(在admin.py下)並不接受它,並顯示'類型'對象不可迭代'錯誤,當我嘗試在瀏覽器中訪問它

+0

您可以連接額外的瀏覽量達到一個特定的模型(以及做任何你想在其中,相關的模型或沒有;如果你願意,我可以張貼的答案與此解決方案),但我不知道有什麼方法可以創建一個純粹的獨立管理視圖,而不是黑客管理源。 – eternicode 2010-11-10 21:19:39

+0

@eternicode實際上完全可以創建獨立的管理視圖:請參閱我的答案。 – 2010-11-10 22:09:44

+0

@Daniel Roseman,啊!我從來沒有見過這種功能,雖然TBH我從來不需要它。 – eternicode 2010-11-10 22:20:01

回答

10

嗯。謝謝大家的幫助。我想出的解決方案(在您的幫助ofcourse :)如下:

我有兩個自定義模板:

my_model_list.html 
    my_model_detail.html 

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

在主的Django網址。潘岳:

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)) 
) 
+1

很高興你自己想通了。我正要對此發表評論。沒有模型的管理視圖基本上只是一個正常的Django視圖,使用帶有模擬ModelAdmin實例的管理模板,這基本上就是你在做什麼。我自己做了這個來創建一些自定義的管理主題頁面。 – Cerin 2013-12-27 16:31:30

2

最直接的答案是「否」。正如Django Book所說,管理員是「受信任的用戶編輯結構化內容」,在這種情況下,結構化內容是按層次結構排列和配置的模型通過settings.py。更重要的是,如果你的對象不完全鴨式完成與預期關係的models.Model,管理員可能會折騰例外所有的地方。

然而,隨着口頭禪說,「這只是python」。你可以覆蓋admin中的任何頁面。只需在您的項目中創建您自己的模板,並讓它們在模板搜索中排名第一。另外,通過繼承admin/base.html,您可以保持管理項目的外觀&。

寫下您的管理視圖和模板這個對象,就像任何其他人,但要確保包裹在is_staff裝飾的意見,以確保視圖從訪問未經授權的用戶的保護。使用templates/admin/object_list.html和object_form.html將這些文件放在應用程序中,也許在admin/views.py中。

一旦您對這些非數據庫對象有適當的管理工具,然後您可以通過管理索引頁面提供對它們的訪問:您想要覆蓋admin/index.html,並向該頁面提供其他項目特定的項目如所須。

我做的正是這種以提供存儲我們的數據,如ConstantContact電子郵件服務的第三方API的管理員權限,並且它工作得很好。

+0

感謝您的幫助精靈。我已經在下面發佈了我的解決方案答案,但林不知道我是否完全按照您的建議。 – sysasa 2010-11-11 15:24:14

5

您可以將您的意見直接添加到AdminSite對象,而不是您註冊的任何特定ModelAdmin子類。

默認AdminSite通過django.contrib.admin.site訪問,這就是你所謂註冊和自動發現什麼。您可以創建自己的子類和add your own views to it,而不是使用此類,然後根據該模型註冊模型而不是默認模型。

+0

有趣;我假設這些子類是由一個'autodiscover'調用拾取的?或者您的子類需要在整個網站的應用程序中使用才能生效? (其實,我覺得我沒有正確理解這個概念......) – eternicode 2010-11-10 22:26:10

+0

謝謝你的幫助Daniel!以下解決方案,但不完全確定這是你的意思。無論如何,它的作品! :) – sysasa 2010-11-11 15:25:17

相關問題