2012-09-17 2 views
1

작동하려면 Creatview() 클래스 기반 함수를 얻었습니다. 제출이 성공하면 이미 데이터가 있으며 '성공'페이지가 표시됩니다.django에 저장하기 전에 데이터를 미리보기하기 위해 CreateView 비헤이비어를 변경

이 동작을이 방법으로 변경하고 싶습니다. CreateView()가 성공하면 데이터의 유효성을 검사하지만 저장하지 않았 으면합니다. 성공 페이지로 이동하는 대신 새로 작성한 인스턴스를 표시하기 위해 DetailView() 클래스를 사용하고 싶습니다. 따라서 사용자는 데이터가 결국 저장 될 때 어떻게 보이는지 알 수 있습니다 ..

사용자는 표시된 데이터에 만족하고, 사용자는 "저장"을 클릭하여 데이터가 저장되고 CreateView()가 완료되거나 사용자가 "다시 편집"을 클릭 할 수 있으며 데이터를 변경하기 위해 양식으로 돌아갈 수 있습니다 DetailView()를 사용하여 새로 생성 된 인스턴스를 표시합니다 (사용자가 만족할 때까지 반복). 클래스 기반 뷰를 우아하게 사용하여이 작업을 수행하는 가장 좋은 방법은 무엇입니까?

from django.views.generic.edit import CreateView 
from restaurant.models import Restaurant 
from restaurant.forms import RestaurantForm 
import uuid 

class RestaurantCreate(CreateView): 
    form_class = RestaurantForm 
    template_name = 'restaurant_form.html' 
    model = Restaurant 

    def form_valid(self, form): 
     form.instance.created_by = self.request.user 
     form.instance.life_id = str(uuid.uuid1()) 
     return super(RestaurantCreate, self).form_valid(form) 

또한 폼 마법사에 대해 알고 있지만 여러 페이지 양식이 없습니다. 무시해도 폼 마법사는 최종 저장 전에 데이터를 미리 볼 수있는 기회를 제공하지 않습니다.

편집 : google groups에 관련 논의,하지만 솔루션

답변

5

는 여기에 내가해야 할 작업은 다음과 같습니다

는 RestaurantCreate 클래스의 form_valid 방법을 덮어 쓰기 및 세션에서 양식을 저장할 수 있습니다. 거기에서 RestaurentDetail보기로 다른보기로 리디렉션 할 수 있습니다. 세션에서 양식을 읽고 필요한 항목을 표시하여 get_object 메소드를 겹쳐 씁니다. 거기에 제출/저장 버튼을 제외한 모든 필드가 숨겨진 양식을 배치 할 수도 있습니다. 양식은 세션에 있던 내용으로 채워집니다. 그래서 사용자가 저장을 누르면 POST가 다른보기 인 ViewFinalCreate보기로 완료됩니다. 정상적으로 CreateView를 구현할 수 있습니다.

덮어 쓸 방법과 방법을 잘 모르는 경우 다음을 확인하십시오. http://ccbv.co.uk/ 정말 나에게 도움이되었습니다.

또한 상위 클래스 ModelFormMixin에서 저장을 트리거하기 때문에 RestaurantCreate 뷰의 form_valid 메소드에서 super를 사용하지 마십시오.

+0

+1은 CCBV를 언급합니다. (나는 그것을 만들었습니다 :) – meshy

+0

@meshy 당신이 그것을 만들었 기 때문에 다행히, 아마 당신이 어떻게 성취의 스 니펫을 공유 할 수 있을까요? – Rexford

관련 문제