2009-11-11 2 views
5

Howdy - J'ai écrit une application très simple pour accepter les demandes d'emploi, y compris un téléchargement de CV.Le fichier ne télécharge pas à partir du formulaire Web dans Django

En exécutant le serveur fourni pour le développement local, je peux télécharger avec succès des fichiers via le formulaire Web sur le frontal et l'interface d'administration. En l'exécutant sur le serveur distant (Apache avec mod_python), je peux télécharger des fichiers avec succès via l'interface d'administration, mais les tentatives effectuées sur l'interface Web ne génèrent aucun fichier téléchargé.

J'ai ajouté FILE_UPLOAD_PERMISSIONS = 0644 aux paramètres, vérifié les deux fichiers de paramètres et recherché des problèmes similaires décrits ailleurs. Figure Je suis soit en train d'oublier un paramètre ou besoin d'aller à ce sujet d'une manière différente. Aucune suggestion?

Pour référence, code inclus.

Le modèle:

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() 

La forme:

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

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

La vue:

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)) 

Répondre

22

Vous ne montrez pas le modèle. Si je devais deviner, car le téléchargement fonctionne via l'interface d'administration, je dirais que vous avez oublié de mettre le enctype dans votre balise form:

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

J'avais oublié de valider le modèle de formulaire et pensant que j'avais, n'a pas vérifié le formulaire sur le développement. Merci de m'avoir fait regarder ce qui aurait dû être évident. – bennylope

+0

J'ai fait la même chose et cela a économisé une tonne de temps à essayer de déboguer. StackOverflow est génial! – Dan

+0

'enctype =" multipart/form-data "' Le web. Des sommes de petites pièces ajoutées de temps en temps qui font le plus grand désordre jamais fait sur terre. J'en ai tellement marre de ça. Et je dois coder dans ce gâchis, et avec ce gâchis. ** 'Sigh' ** –

4

Tout d'abord, avez-vous assuriez votre modèle a enctype="multipart/form-data" le drapeau dedans?

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

Tout d'abord, il n'y a pas besoin de passer outre save() dans votre ModelForm puisque vous ne faites aucun travail supplémentaire en elle. Deuxièmement, il n'y a pas besoin de stocker la variable new_application, il suffit d'appeler form.save(). Troisièmement, vous devez utiliser un champ slug dans votre modèle JobOpening et le transmettre dans la chaîne de requête. Rappelez-vous, ce n'est pas PHP, utilisez de jolies URL comme /jobs/opening/my-cool-job-opening/, c'est ce que sont les slugs; URL lisibles par l'homme uniques. Votre code GET dans votre vue est très fragile en l'état. Enfin, vous pouvez utiliser la fonction de raccourci render_to_response car cela vous évitera d'appeler les chargeurs de gabarit, de créer du contexte et de les rendre manuellement.

+0

Bons points - Je remplace la fonction de sauvegarde parce que j'avais à l'origine - et j'aurai de nouveau - certaines fonctions de messagerie appelées. J'utilise GET au lieu d'un slug car cela semble faciliter l'appel de la page avec un appel AJAX plus tard (peut-être que je me trompe là-bas). – bennylope

+0

Vous pouvez tout aussi bien appeler une jolie url avec ajax. La seule fois que j'utilise des données dans JQuery est sur des requêtes POST via ajax. – Soviut

+0

Utilisez également la méthode dictionary() pour que si la variable n'existe pas dans le dictionnaire GET/POST, vous pouvez lui affecter une valeur par défaut afin que votre code ne plante pas.Exemple: request.POST.get ('myvalue', '') – Soviut

Questions connexes