在Django中如何获取文件上传后的绝对路径?

2023-11-23

我想将文件上传到我的数据库,上传后导入它并最终将数据导出到我的数据库中。我的上传工作正常,但我不确定如何在上传文件后获取文件的绝对路径。我可以打印出文档的名称,但如果上传相同的文档名称,则会附加该名称,但如果我调用,仍然显示原始文件名form.cleaned_data['document'].name。我该怎么做才能获取绝对文件路径,然后调用函数来开始处理该文件?

所以这就是我想要做的:

  • 用户上传 .csv 文件
  • 文件保存在数据库中(带有描述和文件路径。文件路径正确存储在数据库中)
  • 获取刚刚上传的文件的文件位置
  • 开始处理此文件以转换 .csv 数据并存储在数据库中

模型.py

from django.db import models

# Create your models here.
class Document(models.Model):
    description = models.CharField(max_length=255, blank=True)
    document = models.FileField(upload_to='documents/')
    uploaded_at = models.DateTimeField(auto_now_add=True)

views.py

from django.shortcuts import render, redirect
from django.views import View
# Create your views here.

from .forms import DocumentForm
from .models import Document   

class  FileUpload(View):
    def post(self, request):
        form = DocumentForm(request.POST, request.FILES)
        if form.is_valid():
            print()
            print(form.cleaned_data['document'].name)
            form.save()
            return redirect('main_db_model:home')
        else:
            return render(request, 'file_upload_form.html', {
                'form': form
            })

    def get(self, request):
        form = DocumentForm()
        return render(request, 'file_upload_form.html', {
            'form': form
        })

forms.py

from django import forms
from .models import Document

class DocumentForm(forms.ModelForm):
    class Meta:
        model = Document
        fields = ('description', 'document', )

file_upload_form.html(模板):

{% extends "base.html" %}

{% block content %}
  <form method="post" enctype="multipart/form-data">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">Upload</button>
  </form>
      {% if saved %}
         <strong>Your profile was saved.</strong>
      {% endif %}
  This is the form page
  <p><a href="{% url 'main_db_model:home' %}">Return to home</a></p>

    <p>Uploaded files:</p>
      <ul>
        {% for obj in documents %}
          <li>
            <a href="{{ obj.document.url }}">{{ obj.document.name }}</a>
            <small>(Uploaded at: {{ obj.uploaded_at }})</small>
            {{ obj.document.url }}
          </li>
        {% endfor %}
      </ul>
{% endblock %}

之前我建议你改变这个upload_to='documents/' to upload_to='documents/%Y/%m/%d', 为什么?这可以处理您的路径中的巨大文档文件documents/.


form.cleaned_data['document'] (or request.FILES['document'])返回一个UploadedFile目的。当然form.cleaned_data['document'].name应该只返回一个名称。

class  FileUpload(View):
    def post(self, request):
        form = DocumentForm(request.POST, request.FILES)
        if form.is_valid():
            # this `initial_obj` if you need to update before it uploaded.
            # such as `initial_obj.user = request.user` if you has fk to `User`, 
            # if not you can only using `obj = form.save()`
            initial_obj = form.save(commit=False)
            initial_obj.save()

            # return path name from `upload_to='documents/'` in your `models.py` + absolute path of file.
            # eg; `documents/filename.csv`
            print(initial_obj.document)

            # return `MEDIA_URL` + `upload_to` + absolute path of file.
            # eg; `/media/documents/filename.csv`
            print(initial_obj.document.url)

            form.save()

但如果你使用的话你会得到不同的结果upload_to='documents/%Y/%m/%d',

print(initial_obj.document)      # `documents/2017/02/29/filename.csv`

print(initial_obj.document.url)  # `/media/documents/2017/02/29/filename.csv`
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在Django中如何获取文件上传后的绝对路径? 的相关文章

随机推荐

  • 由于“错误 LNK2028:无法解析的令牌...”,我无法编译解决方案

    我有一个用 C 编写的 dll 和一个用 Visual C 编写的 exe 我将 dll 中的函数声明为 string declspec dllexport ConfigureHAT T STRING pathFile 在 exe 项目中
  • 重置 Chrome DevTools 控制台上下文的方法

    Chrome gt DevTools gt console 中是否有任何功能可以清除 重置 删除在测试时声明的变量和函数 就像调用clear 清除日志一样 举个例子 我有一个用 let 关键字声明的变量 let str Hello 我通过控
  • 在测试中实例化多个 Spring Boot 应用程序

    我有几个 Spring Boot 应用程序实例 它们同时对数据库进行一些工作 每个实例都在单独的 JVM 中运行 这是一种用 Java 编写测试以在一个 JVM 上进行测试的方法吗 就像下面这样 设置一些嵌入式数据库用于测试目的 甚至只是模
  • 为什么在 AngularJS 中使用 $onInit? [复制]

    这个问题在这里已经有答案了 在 AngularJS 中 onInit函数是否可以在没有该函数的情况下进行相同的初始化 例如这个 module component myComponent controller function const c
  • 理解和可视化递归

    我在这里提到了几个有关递归的问题 但我无法理解递归如何解决这个特定问题 Python中获取字符串中所有字符组合的递归程序 st def combi prefix s if len s 0 return else st append pref
  • 是否可以在 Twitter Bootstrap 中的模态中使用“行”和“跨度”?

    我正在尝试使用 Twitter Bootstrap 中的模式来实现联系表单 理想情况下 我希望前两个字段集彼此相邻对齐 第三个字段集 包含文本区域和提交按钮 占据模式的整个宽度 我尝试使用行和跨度来使它们很好地发挥作用 但不确定如何进行此操
  • 是否应该在第二个 lambda 中重用 LINQ lambda 表达式参数?

    下列的这个问题我想知道lambda参数表达式实例的重用应该被认为是好还是坏 我有时会得到一个完整的 LINQ 表达式树 其中相同的 lambda 参数实例在第二个非嵌套 lambda 中正确使用 class Person public in
  • PHP 中 mb_detect_order() 的奇怪行为

    我想检测一些文本的编码 使用 PHP 为此 我使用 mb detect encoding 函数 问题是 如果我使用 mb detect order 函数更改可能编码的顺序 该函数会返回不同的结果 考虑下面的例子 html lt lt lt
  • Chrome 扩展:下载/导出“即时”创建的内容

    我需要让用户下载从扩展中包含的某些数据动态创建的文件 但我不想在服务器端执行此操作 作为一个现实世界的例子 有一个变量包含文本 hello world 我希望用户能够下载 创建 TXT包含此类文本的文件 是否可以 2010年10月30日编辑
  • 无法安装node-sass

    我正在尝试安装node sass 但它不让我安装 我尝试过更新npm 我把这个放进去 sudo npm install g 节点 sass 我得到了这个 从错误之前的一行开始 gyp verb build dir attempting to
  • 无法使用 Sheets API 访问公共工作表

    一年多以来 我一直在网页上使用 Google Sheets APIv4 来显示公开共享的 Google 电子表格中的数据 尽管我们这边没有任何改变 但 Sheets API 现在返回 403 权限被拒绝错误 我尝试访问的工作表是我拥有的工作
  • Lucene:如何获取文档的分数

    我想输出文档的分数 我为此编写的代码是 IndexReader reader IndexReader open FSDirectory open indexDir IndexSearcher searcher new IndexSearch
  • Github远程推送包大小超出

    我是 Git 新手 有一个相当大的项目 我想将其推送到 Github 上的远程存储库 存储库 B 原始项目也在 Github 上 但来自不同的存储库 存储库 A 我必须先对 Repo A 中的文件进行一些更改 然后才能在 Repo B 上设
  • 如何连接到 AVD

    我正在尝试编写自己的 Android http 服务器 没问题 但我的 AVD 有问题 我不想每次想要测试更改时都将应用程序下载到手机上 我想通过 AVD 连接到我的应用程序 为了获取IP地址 我使用这个函数 private String
  • 继承字典的序列化类不是序列化属性

    我有一个继承自 Dictionary 的类 并且有几个属性 当我序列化时 它仅序列化字典而不序列化属性 如果我有一个包含属性的有效负载 它会反序列化为它们 如何让它序列化我的对象 包括属性 public class Maintenance
  • 使用时钟滴答作为随机数种子

    我使用当前时钟滴答作为随机数生成的种子 随机数用于伪 GUID 并且在我的数据库中进行检查将确保它在返回之前不存在 平均而言 在进程的生命周期内 该方法将被连续调用大约 10k 次 我担心的是 可能会连续生成相同的号码 从而导致对我的数据库
  • 如何获取 clojure 数组映射来维护 assoc 之后的插入顺序?

    我有一个array map我就是assoc将一些值写入其中 达到一定大小后 返回值是PersistentHashMap而不是原来的PersistentArrayMap 我在一些网站上读到过有关此行为的信息 有没有办法强制插入顺序即使在ass
  • 在 JavaScript 变量名中使用冒号(例如 a:b:c)

    我刚刚注意到我可以在 javascript 中执行以下操作 a b c d happy days a b c function text alert text 然而我却做不到 var a b c d happy days or var my
  • virtualenv v16.7.2 powershell 激活脚本:“您必须‘来源’此脚本:PS> . .\ENV\Scripts\activate”错误

    问题 python v 3 7 4 上的最新版本 virtualenv 16 7 2 为 activate ps1 脚本添加了 4 行 在 Windows10 powerhsell 上运行时会出现错误 You must source thi
  • 在Django中如何获取文件上传后的绝对路径?

    我想将文件上传到我的数据库 上传后导入它并最终将数据导出到我的数据库中 我的上传工作正常 但我不确定如何在上传文件后获取文件的绝对路径 我可以打印出文档的名称 但如果上传相同的文档名称 则会附加该名称 但如果我调用 仍然显示原始文件名for