2015-01-31 7 views
1

내보기는 여기에 내가 get 메소드에 self.record_files을 채운이장고 캔트

class RecordView(View): 
    record_form = RecordForm 
    record_files = {} 
    templare = 'acquisition.html' 

    def get(self, request, *args, **kwargs): 
     fil = urllib.urlopen('/home/student/wwww.jpg') 
     self.record_files = {'small_cover': SimpleUploadedFile('hehe.jpg', fil.read())} 
     rr_form = self.record_form() 
     return render(request, self.template_name, {'rr_form': rr_form, 
              }) 
    def post(self, request, *args, **kwargs): 
     record = RecordForm(request.POST, self.record_files) 
     record.save() 
     HttpResponseRedirect('/') 

처럼 클래스를 기반으로보기에 전역 변수를 사용합니다 ..하지만 난 데이터를 게시 한 후 나는 빈 사전으로 self.record_files를 참조하십시오. 나는 여기에서 혼란스러워한다. 그렇게하기 위해 내가 뭘 할 수 있을까.

+0

대신 'request.POST, request.FILES'를 수행해야합니까? – karthikr

+0

여기에 내가 양식에서 게시 된 파일에서 파일을 동적으로 저장해야합니다. 우리가 양식에서 게시하는 경우 우리는 요청을 사용합니다. 파일 – wrufesh

답변

1

보기 인스턴스의 상태는 가져 오기와 게시간에 유지되지 않으므로 인스턴스에 record_files을 설정해도 다음 요청을 위해 유지되지 않습니다. 로직을 dispatch 메소드에 넣거나 사용자의 session에 정보를 저장해야합니다.

class RecordView(View): 
    record_form = RecordForm 
    record_files = {} 
    templare = 'acquisition.html' 

    # dispatch is called before deciding whether to use get() or post() 
    # so any instance-level properties that require the request can go here. 
    # This could even go in __init__(). 
    def dispatch(self, request, *args, **kwargs): 
     fil = urllib.urlopen('/home/student/wwww.jpg') 
     self.record_files = {'small_cover': SimpleUploadedFile('hehe.jpg', fil.read())} 
     return super(RecordView, self).dispatch(request, *args, **kwargs) 

    def get(self, request, *args, **kwargs): 
     rr_form = self.record_form() 
     return render(request, self.template_name, {'rr_form': rr_form, 
             }) 

    # self.record_files will be available in a get, or a post (or any valid 
    # method for that matter). 
    def post(self, request, *args, **kwargs): 
     record = RecordForm(request.POST, self.record_files) 
     record.save() 
     return HttpResponseRedirect('/') 
+0

그래서 디스패치 방법을 추가하면 ValueError가 RecordView가 HttpResponse 객체 대신 None을 반환한다는 것을 알게됩니다. – wrufesh

+0

당신은 디스패치에 대해 명확히 알 수 있습니까? 그림을 그려라. – wrufesh

+0

나의 실수는, 파견은 슈퍼를 돌려 주어야한다. –

0

정확하게 작동하는 방법입니다. GET 요청이있을 때마다 메소드 get이 호출되며, POST 요청 인 경우 당연히 메소드를 호출하지만 get 메소드는 호출하지 않습니다. 따라서 여기에 문제를 해결할 수있는 방법이 있습니다 :

from django.views.generic import TemplateView 

class RecordView(TemplateView): 
    record_form = RecordForm 
    record_files = {} 
    template_name = 'acquisition.html' 

    def get_context_data(self, **context): 
     fil = urllib.urlopen('/home/student/wwww.jpg') 
     self.record_files = { 
      'small_cover': SimpleUploadedFile('hehe.jpg', fil.read()) 
     } 
     context.update({ 
      'record_files': self.record_files, 
      'rr_form': self.record_form() 
     }) 
     fil.close() 
     return super(RecordView, self).get_context_data(**context) 

    def post(self, request, *args, **kwargs): 
     context = self.get_context_data() 
     record_form = self.record_form(request.POST, self.record_files) 
     if record_form.is_valid(): 
      record_form.save() 
     ## or do a redirect instead, like you had before: 
     # return HttpResponseRedirect('/') 
     context['rr_form'] = record_form 
     return self.render_to_response(context)