【问题标题】:File does not upload from web form in Django文件不会从 Django 中的 Web 表单上传
【发布时间】:2010-12-15 15:53:16
【问题描述】:

你好 - 我编写了一个非常简单的应用程序来接受包括简历上传在内的工作申请。

在本地运行捆绑的服务器进行开发,我可以通过前端的Web表单和管理界面成功上传文件。在远程服务器上运行它(带有 mod_python 的 Apache)我可以通过管理界面成功上传文件,但尝试通过 Web 前端没有上传文件。

我已将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))

【问题讨论】:

    标签: django file-upload django-forms


    【解决方案1】:

    您没有显示模板。如果我不得不猜测,看到上传是通过管理界面进行的,我会说你忘记把 enctype 放在你的表单标签中:

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

    【讨论】:

    • 我忘记提交表单模板,并认为我有,没有在 dev 上检查表单。谢谢你让我看看应该很明显的东西。
    • 我做了同样的事情,这节省了大量的调试时间。 StackOverflow 太棒了!
    • enctype="multipart/form-data" 网络。小块的总和一次又一次地增加,这使得地球上有史以来最大的混乱。我受够了。而且我必须在那乱七八糟的环境中编码。 Sigh
    【解决方案2】:

    首先,您确定您的模板中有enctype="multipart/form-data" 标志吗?

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

    首先,无需在 ModelForm 中覆盖 save(),因为您没有在其中做任何额外的工作。

    其次,无需存储new_application变量,只需调用form.save()即可。

    第三,您应该在 JobOpening 模型中使用 slug 字段并将其传递到查询字符串中。请记住,这不是 PHP,请使用漂亮的 url,例如 /jobs/opening/my-cool-job-opening/,这就是 slugs 的用途;独特的人类可读网址。在您看来,您的 GET 代码目前非常脆弱。

    最后,您可能希望使用render_to_response 快捷功能,因为它可以让您不必冗长地调用模板加载器、创建上下文并手动渲染它们。

    【讨论】:

    • 好点 - 我正在覆盖保存功能,因为我最初 - 并且将再次 - 调用了一些消息传递函数。我正在使用 GET 而不是 slug,因为这似乎可以让稍后通过 AJAX 调用更容易调用页面(也许我错了)。
    • 您可以使用 ajax 轻松调用漂亮的 url。我在 JQuery 中使用任何数据的唯一一次是通过 ajax 进行 POST 请求。
    • 另外,使用字典 get() 方法,这样如果 GET/POST 字典中不存在变量,您可以为其分配一个默认值,这样您的代码就不会崩溃。示例:request.POST.get('myvalue', '')
    • 谢谢苏维特。我肯定过于密切地关注该部分的一些现有代码。
    猜你喜欢
    • 2014-02-23
    • 1970-01-01
    • 2012-09-30
    • 1970-01-01
    • 1970-01-01
    • 2013-03-18
    • 2014-10-27
    • 2013-10-04
    • 2018-01-25
    相关资源
    最近更新 更多