2012-10-05 52 views
2

我有一個頁面,我正在向用戶顯示查詢集的結果。 我想要做的是讓用戶點擊一個鏈接來申請一個過濾器。django設計模式/最佳實踐:過濾查詢集

目前我所做的就是讓鏈接將「get」參數傳遞給頁面以應用過濾器。該過濾器可以是其他型號或自定義過濾器引用(例如未分配過濾器)

爲了提供一個體面的用戶體驗的實現需要做幾件事情

    視圖
    1. 檢查傳送通過濾波器參數是有效
    2. 檢查什麼類型的過濾器是(基於其他型號或自定義過濾器),以正確的條件應用到查詢集
    3. (可選)的方式,使過濾累積(即您可以繼續添加過濾器)
  • 在模板
    1. 顯示正確的結果集基於choosen過濾器上
    2. 顯示過濾器時,識別哪些過濾器,我們已經應用使當前應用的過濾器顯示爲文本而不是超鏈接。

我想這一定是很常見,有人必須有這樣一種設計模式或最佳實踐比視圖和模板if/else語句的明顯失衡想通了這個其他。

有嗎?

回答

1

我發現Django管理員處理這種功能的方式是一種很好的模式。如果您不熟悉,請查看管理員中的list_filter選項。這與你所描述的相似,但是你的通用性更強。也許這會幫助你思考一些想法?

  • 首先,對於實際的查詢字符串塊,您只需傳遞Django-ORM查找鍵和值對。例如?sites__id__exact=1,tags__in=words等。由於您希望允許跨模型查找,因此您需要在字符串中提供另一部分以包含模型名稱,而不是太難。

  • 要檢查過濾器是否有效,可以簡單地確保模型/字段查找有效。通過分割每個QS塊的部分,您可以識別模型,字段名稱,查找和值。然後,使用Django的內置功能來驗證模型中是否存在字段名稱。你也可以用ForeignKey來做到這一點。 Here's how Django does it

  • 你可以很容易地添加過濾器。您將提供您的視圖和用某種上下文顯示這些過濾器的表單,因此它會持續存在併爲用戶重新填充。此外,你可以輕鬆地堅持查詢字符串。基本上,您在任何時候都會擁有相同的讀取/解析功能,沒有什麼不同。

我認爲鑰匙是自動化的,並儘可能保持乾燥。不要屈服於一堆if語句。將這些查找安全地傳遞到ORM也非常容易,並且很容易捕獲錯誤的查找併爲用戶提供有意義的錯誤消息。

我希望能幫助你在你的道路上! :)

+0

謝謝Bartek。我很關心在GET參數中使用實際的鍵。即使它們是有效的,它們仍然可能是不受歡迎的(例如,允許用戶退出他們不應該訪問的信息)。 –

+0

當然,但您可以在構建查詢時設置權限處理。 – Bartek