2009-11-11 9 views
5

Howdy - 私は履歴書のアップロードを含むジョブアプリケーションを受け入れる非常にシンプルなアプリを作成しました。ファイルはDjangoのWebフォームからアップロードされません

開発用にバンドルされたサーバーをローカルで実行すると、フロントフォームと管理インターフェイスのWebフォームからファイルを正常にアップロードできます。リモートサーバ(mod_pythonを使ったApache)で実行すると、管理インターフェースからファイルを正常にアップロードできますが、ウェブフロントエンドでのアップロードはアップロードされません。

私はFILE_UPLOAD_PERMISSIONS = 0644を設定に追加し、2つの設定ファイルをチェックし、他の場所で説明されている同様の問題を探しました。図私は設定を忘れているか、これを別の方法で行う必要があります。助言がありますか?

参考のため、コードが含まれています。

モデル:

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を置くことを忘れてしまったと言うだろう:

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

私はフォームテンプレートをコミットするのを忘れていたし、私が持っていると思って、開発者のフォームをチェックしなかった。何を明らかにすべきかを見てくれてありがとう。 – bennylope

+0

私は同じことをして、これはデバッグしようとする時間を節約しました。 StackOverflowは素晴らしいです! – Dan

+0

'enctype =" multipart/form-data "'ウェブ。時間がたつにつれて追加された小さな部分の合計は、地球上で一番大きな混乱を招いています。私はそれにうんざりしています。そして、私はその混乱と、その混乱をコードする必要があります。 ** 'Sigh' ** –

4

まず、あなたのテンプレートが持っていることを確認作りましたその中にenctype="multipart/form-data"フラグ?

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

まず、あなたがそれに余分な仕事をしていないので、あなたのModelFormでsave()をオーバーライドする必要はありません。

第2に、new_application変数を格納する必要はありません。単にform.save()と呼んでください。

第3に、JobOpeningモデルでスラッグフィールドを使用して、それをクエリ文字列に渡す必要があります。これはPHPではなく、/jobs/opening/my-cool-job-opening/のようなかなりのURLを使用することを覚えておいてください。一意の人間が読めるURLビュー内のGETコードはそのままでは非常に壊れやすいものです。

最後に、render_to_responseショートカット機能を使用すると、テンプレートローダーを冗長に呼び出す必要がなくなり、コンテキストを作成して手動でレンダリングする必要がなくなります。

+0

良い点 - 私はもともと - そして再び - いくつかのメッセージング関数が呼び出されているので、save関数をオーバーライドしています。私は後でAJAXコールを使ってページを呼び出すのが簡単に思えるように、スラッグの代わりにGETを使用しています(多分私は間違っているかもしれません)。 – bennylope

+0

あなたはajaxでかなりのURLを簡単に呼び出すことができます。 JQueryでデータを使用する唯一の時間は、ajax経由のPOSTリクエストです。 – Soviut

+0

また、GET/POSTディクショナリに変数が存在しない場合は、デフォルトの値を代入してコードがクラッシュしないように、辞書のget()メソッドを使用します。例:request.POST.get( 'myvalue'、 '') – Soviut

関連する問題