2009-12-17 85 views
2

讀者文摘版本:如何從模型中獲取數據(單行如果指定或全表),方法是取模型名稱的URL參數,而不對URLconf進行硬編碼以匹配每個模型?有關詳細信息,請閱讀:模型訪問的Django DRY URL

我做的是有三個型號的應用程序,我想作一個簡單的觀點,即需要一個模型的名稱,並吐出模式的默認經理的Model.manager.all(),,如果有一個slu,,與slu matching相匹配的單個對象。我不知道如何做到這一點,所以我遇到了必須爲每個模型單獨製作views/URLconf的問題。

下面介紹一下的URLconf正在尋找這樣的:

(r'^model1/$', 'model1_index_view', 'model1_index'), 
(r'^model1/(?P<slug>[-\w]+)/$', 'model1_detail_view', 'model1_detail'), 
(r'^model2/$', 'model2_index_view', 'model2_index'), 

它那張有點長,但我覺得你得到的圖片。我正在硬編碼一個相對較大數量的URLconf來做一些我認爲我可以用一個Model作爲參數並可選擇一個slug的View。我擔心的是,如果某人指定了一個模型名稱,說什麼......用戶?是否有一段代碼從應用程序中獲取模型列表,並確保它匹配其中一個,而不是來自contrib.auth或另一個應用程序的模型?

回答

8

使用get_model:

from django.db.models import get_model 

def my_view(request, model_name, item_slug): 
    try: 
     model = get_model('app_name', model_name) 
    except: 
     ## throw an error 
     pass 
    objects = model.objects.get(slug=item_slug) 

然後在網址:

(r'^(?P<model_name>[-\w]+/(?P<slug>[-\w]+)/$', 'model_detail_view', 'model_detail'), 
+0

太感謝了,真的很感謝! – Zack 2009-12-17 20:40:48

+1

您可能想用「try ... except model.DoesNotExist:raise Http404」來包裝「model.objects.get」以避免500錯誤。你可能想要驗證model_name是一個有限的列表之一(你可以在URLconf中使用「(model1 | model2 | model3)」來做到這一點),以避免你提到的某人命名模型的潛在問題, t打算有可訪問性。 – 2009-12-17 20:43:00

+0

這是一個好主意,我不確定在這種情況下是否需要將regexp添加到URLconf中,因爲應用程序內的所有內容都可以瀏覽。不過,我會記住這一點,但它肯定會在未來派上用場(我用正則表達式很糟糕);我希望避免的主要事情是這個應用程序以某種方式「泄漏」到其他應用程序的模型中,如身份驗證。再次感謝您的評論! – Zack 2009-12-17 21:08:12