2016-11-21 4 views
0

처음으로 장고를 사용하고 있습니다. (저는 파이썬에도 일반적으로 익숙합니다.) 그리고 저는 잠시 동안 클래스 기반 뷰와 관련된 특정 문제로 고심하고 있습니다. PHP에서 Laravel을 사용하여 "RESTful Resource Controllers"라고 할 수 있습니다.장고에있는 리소스 뷰

Laravel에 익숙하지 않은 사용자 모두에게 : '리소스'당 하나의 컨트롤러 (장고 - 말로보기)가 있다는 생각입니다. 이 컨트롤러/뷰 등 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을 참조하십시오.

나는이 패턴을 정말 좋아하고 장고에서 사용하고 싶습니다.

내가 이해하는 한, 장고에는 실제로 이런 것들이 없다. 장고에는 클래스 기반 뷰가 있지만 리소스를 나타내지는 않습니다. 오히려 'index()'(PhotoListView)보기, 'show()'보기 (PhotoDetailView) 등을 볼 수 있습니다.

장고에서이 패턴을 어떻게 구현해야하는지 잘 모르겠습니다. 원하는 것이 무엇인지 잘 모르겠습니다.

조사한 후 내가 사용 될 수있는 몇 가지 정보를 발견

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/

내가 첫 번째 링크에서 커스텀 뷰 클래스가 수행 모르겠어요를 그 주식 장고 볼 수 있습니다 ' t (정상적인 Django View는 어느 정도 똑같은 일을한다.), 나는 두 번째 링크가 내가 원하는 것을 정확하게 수행하지 않는다고 생각한다. (정확하게 이해한다면,이 기사는 단지 미들웨어를 문제의 해결책으로 설명한다. Django는 요청에 DELETE/PUT 요청과 함께 전송 된 데이터를 저장하지 않습니다).

url(r'^photos/(.*)$', PhotoView.as_view())

을 :

  • 이 같은 특정 리소스에 대한 모든 URL과 일치하는 URLconf에서 한 줄을 사용하여이를 바탕으로

    , 나는 두 가지 가능한 해결책을 고안 그런 다음 사용자 정의 View 기본 클래스의 as_view() 함수는 /photos, /photos/1/photos/1/edit과 같은 URL의 라우팅을 올바른 클래스 메소드에 처리합니다. 단점은 라우팅을보기 (올바른 위치가 아닌)에 배치하고 이름이 지정된 패턴을이 방식으로 사용하여 코드의 다른 위치에있는 URL을 참조 할 수 없다는 것입니다. 그것은 Laravel에서 작동하는 방식에 가장 가깝습니다. 각 URL에 대한 URLconf에서

  • 를 사용하여 별도의 행, 같은 :

    url(r'^photos$', PhotoView.index) url(r'^photos/(\d+)$', PhotoView.show) url(r'^photos/(\d+)/edit$', PhotoView.edit)

    이의 장점라는 패턴이 평소와 같이 작동, 모든 경로가 URLconf에 남아 있다는 것입니다.그러나 View 클래스 구현 측면에서이를 수행하는 방법을 알지 못합니다 (모든 메서드 @classonlymethod, 오른쪽으로 꾸밀 필요가 있습니다).

죄송합니다. 텍스트 벽을 죄송합니다. 최선을 다해 해결하는 방법에 대한 의견을 듣고 싶습니다. 또는 어쩌면 나는 미친놈 일 뿐이며 모든 정상 장고 코더와 같은 기능 기반보기를 사용해야합니까?

+1

당신은 [장고 REST 프레임 워크]를 본 적이 (http://www.django-rest-framework.org/)? –

+0

@JensAstrup 예, 저는 (반복적으로) 우연히 발견했습니다. 나는 API를 만들지 않고 웹 사이트/웹 애플리케이션을 만들 것이다. – Compizfox

답변

0

질문에 제안 된 두 가지 솔루션을 혼합 한 사용자 지정 클래스 기반보기를 작성했습니다.

일반적인 생각

내가 장고의 View 클래스와 동일한 구조를 (이 as_view()dispatch() 방법이있다) 따르는 ResourceView을 가지고있다. Django의 View처럼 as_view()은 내부에 클로저가 정의되어 있으며 URLconf에 반환됩니다. 이 클로저는 차례로 dispatch()에 의존하여 요청을 올바른 (하위) 메소드로 전달합니다. 이를 위해 라우트 (URL)와 HTTP 메소드의 조합에 대해 호출해야하는 메소드를 판별하기 위해 '2d map'(dicts의 사전)을 사용합니다. Django의 View과의 차이점은 경로를 지정하는 매개 변수로 URLconf에서 as_view()이 호출된다는 것입니다.

또한보기에 해당하는 URLconf를 자동으로 생성하는 ResourceRouter이 있습니다. 이 접근법은 DRF가이를 어떻게 처리하는지에 다소 영향을 받았습니다.

필자는 모델 인스턴스를 메서드에 '바인딩'하는 데코레이터를 작성 했으므로 pk 대신 모델 인스턴스가 뷰 메서드에 전달됩니다.

코드

는 여기에서 찾을 수 있습니다 : https://gist.github.com/Compizfox/c4e3044755417f59dc33ce97ac8ca07c

1

의견에서 Jens으로 제안했습니다. 써드 파티 Django Rest Framework는 당신이 기술 한 Laravel 컨트롤러와 가장 가까운 것입니다. 조사 할 특정 항목은 viewsets입니다.

Django REST 프레임 워크를 사용하면 관련 뷰 집합에 대한 로직을 ViewSet이라는 단일 클래스로 결합 할 수 있습니다. 다른 프레임 워크에서는 도 '리소스'또는 '컨트롤러'와 같은 개념적으로 유사한 구현 인 을 발견 할 수 있습니다.

DRF는 매우 가파른 학습 곡선을 가지고 있습니다. DRF는 또한 API를 만드는 데만 적합하다는 인상을줍니다. 그러나 현실은 DRF를 render HTML and process ordinary HTML forms에 사용할 수 있다는 것입니다.

REST 프레임 워크는 API 스타일 응답과 일반 HTML 페이지를 반환하는 데 적합합니다. 또한 serializer는 HTML 양식 으로 사용할 수 있으며 템플릿으로 렌더링 할 수 있습니다.

물론 클래스 기반보기를 사용하는 것이 좋습니다. 단점은 단일 클래스에서 DRF 뷰 세트의 모든 기능을 제공하지 않는다는 것입니다. 그러나 모든 것이 사라지지 않습니다. CBV Mixins을 사용하여 필요한 기능을 혼합하고 일치시킬 수 있습니다.

+0

감사합니다.나는 웹 사이트가 아니라 API만을위한 것이라고 생각했다. 그래서 나는 더 많이 조사하지 않았다. DRF는 내가 찾고있는 것 같습니다. 그러나 이미 원하는대로하고 DRF보다 훨씬 단순한 사용자 정의 View 기본 클래스를 작성했으며 (완전히 유연하지는 않지만) 완전히 새로운 것을 배우지 않아도됩니다 뼈대. 끝나면 답변으로 게시하겠습니다. – Compizfox

+0

계획처럼 들리지만, 처음부터 뷰 클래스를 작성할 필요는 없습니다. 언급 된대로 믹스를 믹스 (maix)하고 매치 할 수 있습니다. 따라서 코드를 아주 작게 작성해야합니다. – e4c5

+0

너무 늦었습니다. 이미 작성했습니다. ...;) 나는 이러한 믹스 인을 사용하여 리팩토링 할 수 있는지 확인해 보겠습니다. 팁 고마워. – Compizfox

관련 문제