2016-07-12 2 views
1

제출 된 양식에서 개체를 생성 중입니다. 생성 된 AutoField을 숨겨진 양식 요소로 다음 양식으로 전달하려고합니다. 그러나 post()에서 get_context_data()으로 변수를 전달하는 방법을 알 수 없습니다. 나는 post()이 먼저 호출되고 그 다음에 get_context_data()이 붙는 것을 알고 있지만, 변수를 self에 추가하면 예상 한 결과를 얻지 못합니다 (속성은 self에 없습니다). get_context_data에서 호출 할 때post()에서 get_context_data()로 데이터 전달하기

def get_context_data(self, **kwargs): 
    context = super(MyView, self).get_context_data(**kwargs) 
    print self.hello 
    return context 

def post(self, request, *args, **kwargs): 
    self.hello = "hello" 
    return HttpResponseRedirect(request.path) 

self.hello이 유효하지 않습니다 여기에

내가 경험하고있는 무슨의 예입니다. 마치 HttpResponseRedirect(request.path) 호출로 착각할지 모르지만 템플릿을 렌더링하는 방법을 잘 모르겠습니다.

간단한 실수인가, 아니면 전혀 다른 방식으로 접근해야합니까?

+0

'get_context_data()'는'GET' 요청 ('FormView'를 사용한다고 가정)에 대해서만 실행되며'post()'에 의해 처리되는'POST' 요청에는 실행되지 않습니다. 'get_context_data()'는 템플리트 컨텍스트를 얻는 데 사용되며, 어쨌든 리디렉션하는 경우에는 중복됩니다. 당신이 달성하고자하는 것을 정확히 설명 할 수 있습니까? – solarissmoke

+0

여러 양식에 걸쳐 하나의 개체를 만들고 있습니다. Form1은 Form2의 페이지에 게시됩니다. Form2의'post()'에 객체의 절반을 만들고 Form2를 객체가 완성 된 방문 페이지에 제출할 수 있기를 원합니다. 어떤 객체가 만들어 졌는지 알 필요가 있으므로 첫 번째'post()'에서 생성 된'AutoField'를 가져 와서 Form2의 숨겨진 필드로 전달하여 방문 페이지'post() '이 올바른 객체에 액세스 할 것입니다. 더 좋은 방법이있을 것이라고 확신합니다. 제안은 열려 있습니다. (FormWizard 외에도 이유가 있습니다 ...) – Tyler

+0

세션을 사용하여보기간에이 데이터를 저장할 수 있습니까? – solarissmoke

답변

1

개체 ID를 다음 페이지로 전달할 방법을 찾아야합니다. 마음에 오는 옵션은 URL에 넣거나 또는 solarissmoke가 세션에서 저장하도록 제안한 것입니다. 당신이 URL에서 그것을하고 있다면 페이지 시퀀스를 거기에 넣을 수 있습니다 (forst 형식은 1, 두번째는 2).

이 접근법에 대한 좋은 점은 페이지에 따라 get_object 메서드 (self.fields = [....])와 템플릿 이름의 각 필드를 설정하여 모든 뷰를 한 번에 볼 수 있다는 것입니다. get_template_names 메소드에서.

은 그래서 Updateview를 사용하여, 그 결과는 다음과 같습니다

urls.py :

.... 
url(r'^mysite/(?P<object_no>\d+)/(?P<form_no>\d+)$', BaseView.as_view()), 

views.py : 당신은 확인 모든 필드 것을해야

class BaseView(UpdateView): 
    def get_object(self):  
     obj=MyModel.objects.get(id=self.kwargs['object_no']) 
     form_no = self.kwargs['form_no'] 
     if form_no=="1": 
      self_fields=["field1","field2"...] 
     ..... 
    def get_object(self):  
     obj=MyModel.objects.get(id=self.kwargs['object_no']) 
     form_no = self.kwargs['form_no'] 
     if form_no=="1": 
      self_fields=["field1","field2"...] 
     .....    
     return obj 
    def get_template_names(self): 
     from_no = self.kwargs['form_no'] 
     if form_no=="1": 
      return ["template1.html"] 
     .... 

null도 가능

+0

이것은 결국 완벽 해졌습니다. 감사. – Tyler

2

post을 직접 정의하면보기의 기본 동작이 재정의됩니다. get_context_data 또는 다른 클래스 메소드에 대한 호출이 없다는 것을 알 수 있으므로 당연히 호출되지 않습니다.

일반적으로 특정 가져 오기 또는 게시 방법을 재정의해서는 안됩니다. 전체보기를 표시하지 않았으므로 달성하려는 행동이 명확하지 않을 수 있습니다. 예를 들어 양식보기에서 success_url을 정의하여 제출 후 양식 리디렉션 위치를 설정하고자 할 수 있습니다.