我第一次使用Django(我也是一般的Python新手),我一直在努力解決與基於類的視圖有關的某個問題。我來自Laravel的PHP,在那裏你可以有所謂的「RESTful資源控制器」。在Django中的資源視圖
對於每個不熟悉Laravel的人來說:這個想法是每個'資源'有一個控制器(或者用Django說話)。該控制器/視圖定義的方法,如index()
,show()
,create()
,store()
,edit()
等,爲這些控制器方法的相關聯的URL和HTTP方法GET /photos
,GET /photos/1
,GET /photos/create
,POST /photos
,GET /photos/1/edit
分別(例如,如果你正在處理與照片)。在Laravel的路由中,您必須聲明一行Route::resource('photos', 'PhotoController')
,這些URL將自動生成。欲瞭解更多信息,我參考Laravel's docs。
我真的很喜歡這種模式,我想在Django中使用它。
據我所知,Django並沒有真正具備這種開箱即用的功能。 Django確實具有基於類的視圖,但這些視圖不代表資源。相反,您可以查看您的'index()'(PhotoListView
),查看您的'show()'(PhotoDetailView
)等等。
我不知道我應該如何在Django中實現這個模式,我甚至不確定我想要的是不是一個好主意。
研究後,我發現了一些信息,可能是有用的:
http://watchitlater.com/blog/2010/02/django-restful-resources/
https://baxeico.wordpress.com/2014/06/25/put-and-delete-http-requests-with-django-and-jquery/
我不知道從第一鏈接自定義視圖類實現了這個股票的Django視圖可以」 t(一個普通的Django View或多或少都是相同的東西,對吧?),我不認爲第二個鏈接完全符合我的要求(如果我理解正確,文章僅僅將中間件描述爲問題的解決方案Django不會將請求中的DELETE/PUT請求發送的數據放入請求中)。
在此基礎上,我設計了兩種解決辦法:
使用一個單一的線相匹配的所有URL一定的資源,像這樣的URL配置:
url(r'^photos/(.*)$', PhotoView.as_view())
的
as_view()
然後,自定義View基類的函數將處理諸如/photos
,/photos/1
和/photos/1/edit
等URL的路由到正確的類方法。缺點是你把路由放到一個視圖中(而不是正確的位置),並且你不能使用命名模式來引用代碼中其他地方的URL。儘管它最接近它在Laravel的作品。使用單獨的行URL配置每個網址,如:
url(r'^photos$', PhotoView.index) url(r'^photos/(\d+)$', PhotoView.show) url(r'^photos/(\d+)/edit$', PhotoView.edit)
這樣做的好處是,命名模式照常上班,和所有的路由停留在URL配置。但是,我不知道如何在View類的實現方面做到這一點(我必須修飾每個方法@classonly方法,正確)。
對不起,我很樂意聽到你的想法如何最好地解決這個問題。或者,也許我只是瘋狂的batshit,我應該像每個正常的Django編碼器一樣使用基於函數的視圖嗎?
你見過[Django的REST框架(http://www.django-rest-framework.org/)? –
@JensAstrup是的,我(一再)偶然發現了這一點。我不是建立一個API,但一個網站/ webapp。 – Compizfox