Файл не загружается из веб-формы в Django - PullRequest
6 голосов
/ 12 ноября 2009

Привет, я написал очень простое приложение для приема заявлений о приеме на работу, включая загрузку резюме.

Запуск локального сервера для разработки, я могу успешно загружать файлы через веб-форму на интерфейс и интерфейс администратора. Запустив его на удаленном сервере (Apache с mod_python), я могу успешно загружать файлы через интерфейс администратора, но попытки через веб-интерфейс не дают загруженного файла.

Я добавил 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))

Ответы [ 2 ]

26 голосов
/ 12 ноября 2009

Вы не показываете шаблон. Если бы мне пришлось угадывать, видя, как загрузка работает через интерфейс администратора, я бы сказал, что вы забыли поместить enctype в тег формы:

<form enctype="multipart/form-data" method="post" action="/foo/">
5 голосов
/ 12 ноября 2009

Во-первых, вы убедились, что в вашем шаблоне есть флаг enctype="multipart/form-data"?

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

Во-первых, нет необходимости переопределять save() в вашей ModelForm, поскольку вы не выполняете в нем никакой дополнительной работы.

Во-вторых, нет необходимости хранить переменную new_application, просто вызовите form.save().

В-третьих, вы должны использовать поле slug в своей модели JobOpening и передавать его в строку запроса. Помните, это не PHP, используйте красивые URL-адреса, такие как /jobs/opening/my-cool-job-opening/, для этого и нужны слагы; уникальные читабельные URL. Ваш GET-код на ваш взгляд очень хрупкий.

Наконец, вы можете использовать функцию быстрого вызова render_to_response, поскольку это избавит вас от необходимости подробно вызывать загрузчики шаблонов, создавать контекст и отображать их вручную.

...