【问题标题】:Django: Upload Files and Save to DiskDjango:上传文件并保存到磁盘
【发布时间】:2013-12-26 02:33:59
【问题描述】:

我正在尝试通过我的项目中的表单上传一些文件并将文件保存到磁盘。目前,我能够将数据插入数据库 (postgreSQL),但数据并未写入磁盘。我已经环顾四周,使用modelform 和调用save 应该会处理好所有事情(但显然我错过了什么?)。任何帮助表示赞赏。

这是我的代码: views.py(用于上传与工作相关的文件)

# Upload files to a Job (Developer)
@login_required()
@user_passes_test(lambda u: u.groups.filter(name='Developer').exists(), login_url='/login/', redirect_field_name='not allowed')
@require_http_methods(['POST'])
def job_file_upload(request, jobid):

    # Get the Job
    job = Jobs.objects.get(id=jobid)
    fileform = JobFileSubmitForm(request.POST, request.FILES)
    if fileform.is_valid():
        jfs = fileform.save(commit=False)
        file = request.FILES['file']
        jfs.user_id = request.user.id
        jfs.job_id = jobid
        jfs.file = file.name
        jfs.uploadDate = datetime.now()
        # Save to DB
        jfs.save()

        return redirect('view_job', jobid=jobid, slug=job.slug)

models.py(用于保存文件数据并保存到正确路径的数据库)

from django.core.files.storage import FileSystemStorage

fs = FileSystemStorage(location='/media/')

...


def upload_job_file_path(instance, filename):
    return os.path.join('/uploads/job_meta/files/', instance.id, filename)


# Submit Files for a Job (Developer Role)
class JobFileSubmit(models.Model):
    job = models.ForeignKey(Jobs)
    user = models.ForeignKey(User)
    file = models.FileField(storage=fs, upload_to=upload_job_file_path, blank=False, null=False)
    uploadDate = models.DateTimeField(auto_now=True)

forms.py

class JobFileSubmitForm(forms.ModelForm):

    class Meta:
        model = JobFileSubmit
        fields = 'file',

    def save(self, commit=True):
        jobfilesubmit = super(JobFileSubmitForm, self).save(commit=False)

        if commit:
            jobfilesubmit.save()
        return jobfilesubmit

view.html

                            <form method="post" action="/job/job_file_upload/j{{ job.id }}/" class="form-inline btn-group" enctype="multipart/form-data">
                                {% csrf_token %}
                                <div class="span6 inline">
                                    <label class="control-label">Attach Files: </label>{{ job_file_submit.file }}
                                    <p class="help-block">Attach files that go with this Job.</p>
                                </div>
                                <div class="modal-footer">
                                    <button type="submit" class="btn btn-success btn-med pull-left"><i class="fa fa-check-circle"></i> Attach Files</button>
                                    <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
                                </div>
                            </form>

TL;DR:当前表单提交,插入数据库,但数据没有写入磁盘和它应该写入的动态路径。例如,数据未写入:

/media/uploads/job_meta/files/{{job.id}}/{{file.name}}

感谢您抽出宝贵时间阅读本文!非常感谢任何帮助!

【问题讨论】:

  • 看起来您的 upload_job_file_path 函数返回一个绝对文件路径。
  • 啊。必须是相对的吗?如:uploads/job_meta/files/。假设这考虑到 MEDIA_ROOT 作为前缀?
  • 是的。我看到的第二个问题是您的路径包含 job.id,当使用新的和未保存的作业调用时它是 None 。
  • 卡努,你能举个例子来说明你的意思吗?我对 Python 和 Django 还比较陌生。 :( 这看起来正确吗?仍然将信息发布到数据库,但文件未上传:` def upload_job_file_path(instance, filename): return os.path.join('uploads/job_meta/files/', instance,文件名)`
  • 我希望这可以工作:models.FileField(upload_to="uploads/job_meta/files/", blank=False, null=False)

标签: python django django-models django-views django-file-upload


【解决方案1】:

我不确定这是否是最终答案,但在这里编写代码块更容易

upload_job_file_path 需要从 MEDIA_ROOT 返回一个相对路径。 如果我理解正确,id 是实例的 job_id 而不是它的 id。 这样,以下功能应该可以工作。 (可能 FileField 必须在代码中的作业字段下方)

models.py

def upload_job_file_path(instance, filename):
    return 'uploads/job_meta/files/%s/%s' % (instance.job_id, filename)


class JobFileSubmit(models.Model):
    job = models.ForeignKey(Jobs)
    user = models.ForeignKey(User)
    file = models.FileField(upload_to=upload_job_file_path, blank=False, null=False)
    uploadDate = models.DateTimeField(auto_now=True)

我对 modeforms 不太熟悉,但我认为 save 方法也应该处理文件上传。 所以这可能就足够了

views.py

if fileform.is_valid():
    jfs = fileform.save(commit=True)

【讨论】:

  • 天哪……就是这样。卡努,我爱你。你刚刚让我免于扯掉我的头发。
猜你喜欢
  • 2018-09-14
  • 2018-02-25
  • 1970-01-01
  • 2016-02-20
  • 1970-01-01
  • 1970-01-01
  • 2016-07-22
  • 2013-12-19
  • 2010-09-23
相关资源
最近更新 更多