【问题标题】:How To Open and Read a File of Type FileField in Django?如何在 Django 中打开和读取 FileField 类型的文件?
【发布时间】:2021-02-25 19:09:48
【问题描述】:

我正在尝试打开一个将通过 django FileField 属性上传的文件。我还想读取文件的内容并将其输出。但是当我打开(obj.file)时,它给了我一个错误,上面写着“预期的 str、字节或 os.PathLike 对象,而不是 FieldFile”所以,我不知道如何解决这个问题!我也尝试使用 obj.file.read(),这可以完成工作,但它会在输出中提供这些“\n”“\r”字符。

这是我的观点.py

from django.shortcuts import render
from .forms import ReaderForm

def HomePage(request):
    text = None
    if request.method == "POST":
        form = ReaderForm(request.POST or None, request.FILES or None)
        if form.is_valid():
            file = form.cleaned_data.get('file')
            obj = form.save(commit=False)
            obj.file = file
            obj.save()

            f = open(obj.file, "r")
            print(f.read())

    else:
        form = ReaderForm()
    context = {
        "form": form,
        "text": text
    }
    return render(request, "reader/home.html", context)

这是models.py


from django.db import models
from django.utils import timezone



class Reader(models.Model):
    file = models.FileField(blank=True, null=True)
    date_uploaded = models.DateTimeField(default=timezone.now)

    class Meta:
        ordering = ['-date_uploaded']
        verbose_name_plural = "Reader"

这是我的模板文件(home.html)

{% extends 'reader/base.html' %}


{% block head %}
    <title>File Reader</title>
{% endblock %}


{% block content %}
    <h1>File Reader</h1>

    <form method="POST" enctype="multipart/form-data"> {% csrf_token %}
        {{ form.as_p }}
        <button type="submit">Submit</button>
    </form>

    {% if not text == None %}
        <p>{{ text }}</p>
    {% endif %}

{% endblock %}

最后,forms.py


from .models import Reader
from django import forms


class ReaderForm(forms.ModelForm):
    class Meta:
        model = Reader
        fields = ['file']

感谢您的任何回答!

【问题讨论】:

  • 在您的模板中也使用{% if text %} 而不是{% if not text == None %}。并将action attribute 添加到您的html 表单中:action="/your-name/"

标签: python django file


【解决方案1】:

FieldFile 对象包括它自己的打开。而不是

f = open(obj.file,'r')

这样做:

f = obj.file.open('r')

【讨论】:

  • 谢谢!它有效,但是您有什么方法可以保留换行符和空格。因为输出只是继续,没有任何换行符。没有空格
  • 任何人都不应该以任何方式操纵内容。您应该可以通过lines = obj.file.open('r').readlines()lines = obj.file.open('r').read().splitlines() 获得线路。
  • 我敢打赌你会将结果打印到网页上。如果是这样,是网络浏览器删除了行和空格。你可以把它放在&lt;pre&gt;标签里面。
  • splitlines() 和 readlines() 只是在列表中给出输出。但你是对的。我正在将结果打印到网页上。 &lt;pre&gt; 标签有效!谢谢!
【解决方案2】:

FileField (Django docs) 有一个 path 属性。

所以你可以这样做:

f = open(obj.file.path, "r")
print(f.read())

【讨论】:

  • 谢谢!您的解决方案也有效。但是你有什么方法可以保留换行符和空格吗?因为输出只是继续,没有任何空格和换行符。
  • 另外,action 属性只是将我带到另一个页面。感谢您对 {% if text %} 的建议。这减少了我的代码。
猜你喜欢
  • 1970-01-01
  • 2022-08-04
  • 2020-01-31
  • 2015-09-16
  • 1970-01-01
  • 1970-01-01
  • 2018-12-14
  • 2020-02-19
  • 1970-01-01
相关资源
最近更新 更多