2009-11-11 2 views
5

안녕하세요 - 이력서 업로드를 포함하여 취업 응용 프로그램을 허용하는 매우 간단한 앱을 작성했습니다.파일이 장고의 웹 양식에서 업로드되지 않습니다

개발을 위해 번들로 구성된 서버를 로컬에서 실행하면 프런트 엔드 및 관리 인터페이스의 웹 양식을 통해 파일을 업로드 할 수 있습니다. 원격 서버에서 실행 (mod_python을 사용하는 Apache) admin 인터페이스를 통해 파일을 성공적으로 업로드 할 수 있지만 웹 프론트 엔드를 통한 시도는 업로드 된 파일을 생성하지 않습니다.

설정에 FILE_UPLOAD_PERMISSIONS = 0644을 추가하고 두 설정 파일을 확인한 다음 다른 곳에서 설명한 유사한 문제를 찾았습니다. 그림 나는 설정을 잊어 버렸거나 다른 방향으로 갈 필요가 있습니다. 어떤 제안?

참조 용 코드가 포함되어 있습니다.

모델 :

class Application(models.Model): 
    job = models.ForeignKey('JobOpening') 
    name = models.CharField(max_length=100) 
    email = models.EmailField() 
    date_applied = models.DateField() 
    cover_letter = models.TextField() 
    resume = models.FileField(upload_to='job_applications', blank=True) 

    def __str__(self): 
     return self.name 

    def save(self): 
     if not self.date_applied: 
      self.date_applied = datetime.today 
     super(Application, self).save() 

형태 :

class JobApplicationForm(ModelForm):  
    class Meta: 
     model = Application 

    def save(self, commit=True, fail_silently=False): 
     super(JobApplicationForm, self).save(commit) 

뷰 :

def job_application(request): 
    ajax = request.GET.has_key('ajax') 
    if request.method == 'POST': 
     form = JobApplicationForm(request.POST, request.FILES) 
     if form.is_valid(): 
      new_application = form.save() 
      return HttpResponseRedirect('/about/employment/apply/sent/') 
    elif request.GET.has_key('job'): 
     job = request.GET['job'] 
     form = JobApplicationForm({'job': job}) 
    else: 
     return HttpResponseRedirect('/about/') 
    t = loader.get_template('employment/job_application.html') 
    c = Context({ 
     'form': form, 
    }) 
    return HttpResponse(t.render(c)) 

답변

22

당신은 템플릿을 표시하지 않습니다. 당신이 당신의 템플릿이이 있는지 만들어 가지고,

<form enctype="multipart/form-data" method="post" action="/foo/"> 
+1

양식 템플릿을 작성하는 것을 잊어 버렸습니다. 개발자가 양식을 확인하지 않았다고 생각합니다. 무엇이 분명해야했는지 보도록 하셔서 고맙습니다. – bennylope

+0

나는 똑같은 짓을했는데 디버깅을하는 데 엄청난 시간을 절약했습니다. StackOverflow는 멋지다! – Dan

+0

'enctype = "multipart/form-data"'웹. 작은 조각의 합계는 지구상에서 가장 큰 엉망을 만든 시간을 추가했습니다. 나는 너무 지긋 지긋하다. 그리고 난 그 난장판에서, 그리고 그 난장판으로 코드해야합니다. **'Sigh' ** –

4

첫째 : 내가 업로드가 관리자 인터페이스를 통해 작동으로보고, 추측이 있다면, 난 당신이 양식 태그에 enctype에 넣어 잊어 버린 말하고 싶지만 그것에 enctype="multipart/form-data" 깃발? 먼저

<form action="." method="POST" enctype="multipart/form-data"> 
    ... 
</form> 

, 당신은 거기에 추가 작업을 수행하지 않을 이후 ModelForm에 save()를 오버라이드 (override) 할 필요가 없습니다.

두 번째로 new_application 변수를 저장할 필요가 없으므로 간단히 form.save()을 호출하십시오.

세 번째로 JobOpening 모델에서 슬러그 필드를 사용하고 쿼리 문자열에이를 전달해야합니다. 이것은 PHP가 아니라, /jobs/opening/my-cool-job-opening/과 같은 pretty urls를 사용한다는 것을 기억하십시오. 독창적 인 사람이 읽을 수있는 URL. 당신의 GET 코드는 매우 약해 보인다.

마지막으로 render_to_response 바로 가기 기능을 사용하면 템플릿 로더를 자세히 호출하고 컨텍스트를 만들고 수동으로 렌더링하지 않아도되므로 바로 가기 기능을 사용하려고 할 수 있습니다.

+0

좋은 점 - 원래는 메시지 저장 기능을 호출했기 때문에 저장 기능을 재정의했습니다. 나중에 AJAX 호출로 페이지를 호출하는 것이 더 쉬워 보이는 것처럼 슬러그 대신 GET을 사용하고 있습니다 (어쩌면 내가 틀렸을 수도 있습니다). – bennylope

+0

아약스로 예쁜 URL을 쉽게 호출 할 수 있습니다. JQuery에서 데이터를 사용하는 유일한 시간은 ajax를 통한 POST 요청입니다. – Soviut

+0

또한 사전 get() 메서드를 사용하여 변수가 GET/POST 사전에 없으면 코드를 크래시하지 않도록 기본값을 할당 할 수 있습니다.예 : request.POST.get ('myvalue', '') – Soviut

관련 문제