我检查了几个其他线程,但我仍然有问题.我有一个包含FileField的模型,我正在为各种目的生成半随机实例.但是,我在上传文件时遇到问题.
当我创建一个新文件时,它似乎工作(新实例保存到数据库),在相应的目录中创建一个文件,但文件的内容丢失或损坏.
这是相关代码:
class UploadedFile(models.Model):
document = models.FileField(upload_to=PATH)
from django.core.files import File
doc = UploadedFile()
with open(filepath, 'wb+') as doc_file:
doc.documen.save(filename, File(doc_file), save=True)
doc.save()
Run Code Online (Sandbox Code Playgroud)
谢谢!
下面是我项目中django代码的简化版本; 它允许用户上传文件并给它一个标题.此功能非常有效.但是,当用户稍后重新编辑表单时,会重新显示文件和标题,但是当用户提交文件时会清空文件.重新打开以进行编辑的表单的文件字段如下所示:
目前: media_location/uploadedfile.mp3
更改: [选择文件]无文件选择
在我提交之后,它是:
- 此归档是必需的
[选择文件]无文件选择
如何获取它以便用户不必重新上载文件?对于我来说,一旦提交完成后字段是否只读,或者它是否仍然可编辑并不重要.完成的项目不适用于客户端,只能供一小组可信用户使用,但我仍希望尽可能遵循最佳实践.谢谢你的帮助.
Django代码:
models.py
class Recording(models.Model):
rec_title=models.CharField(max_length=200,blank=True)
rec_file = models.FileField(upload_to='recordings')
Run Code Online (Sandbox Code Playgroud)
forms.py
from django import forms
from songstorage.models import Recording
class RecordingForm(forms.ModelForm):
rec_file=forms.FileField(label='Upload File')
rec_title=forms.CharField(label='Recording Title',required=False)
class Meta:
model=Recording
Run Code Online (Sandbox Code Playgroud)
views.py
def addrecordings(request,recordingfile):
#if there is a recordingfile in the url, the user is editing...
if recordingfile:
recording=Recording.objects.get(rec_title=recordingfile)
recording_form = RecordingForm(instance=recording)
#...Otherwise a new form is createing a new one
else:
recording_form = RecordingForm(request.POST, request.FILES)
#When the form is submitted, do the following:
if …Run Code Online (Sandbox Code Playgroud) 我正在尝试为 FileField 模型制作动态上传路径。因此,当用户上传文件时,Django 将其存储到我的计算机 /media/(username)/(path_to_a_file)/(filename)。
例如 /media/Michael/Homeworks/Math/Week_1/questions.pdf 或 /media/Ernie/Fishing/Atlantic_ocean/Good_fishing_spots.txt
VIEWS
@login_required
def add_file(request, **kwargs):
if request.method == 'POST':
form = AddFile(request.POST, request.FILES)
if form.is_valid():
post = form.save(commit=False)
post.author = request.user
post.parent = Directory.objects.get(directory_path=str(kwargs['directory_path']))
post.file_path = str(kwargs['directory_path'])
post.file_content = request.FILES['file_content'] <-- need to pass dynamic file_path here
post.save()
return redirect('/home/' + str(post.author))
MODELS
class File(models.Model):
parent = models.ForeignKey(Directory, on_delete=models.CASCADE)
author = models.ForeignKey(User, on_delete=models.CASCADE)
file_name = models.CharField(max_length=100)
file_path = models.CharField(max_length=900)
file_content = models.FileField(upload_to='e.g. /username/PATH/PATH/..../')
FORMS
class AddFile(forms.ModelForm):
class Meta:
model = File …Run Code Online (Sandbox Code Playgroud) django file-upload django-models filefield django-file-upload
我想在我的应用程序中上传和保存多个文件,我
在我的模板中.当我点击上传时,似乎
只保存了一个文件,它是许多已加载文件列表中的最后一个文件.如何使用表单保存所有上传的文件?谢谢
<input type="text" name="name" value="" />
<input type="file" name="file" multiple/>
form = MyForm(request.POST, request.FILES) form = MyForm(request.POST, request.FILES) blah blah
编辑
Myform是此模型的模型表单.
class Docs(models.Model):
name = models.CharField(max_length=128)
file = models.FileField(max_length=100, upload_to="documents/")
Run Code Online (Sandbox Code Playgroud) python django django-templates django-forms django-file-upload
我想在模板中显示用户上传的文件的大小。我已经看到文件对象具有属性 size 但是,因为我是 Python 和开发领域的新手,所以我很难理解如何使用它。
经过一些测试,我开发了这个脚本(filesize)添加到模型的末尾,您可以使用它上传文件:
class FileUpload(models.Model):
name = models.CharField(
max_length=50,
)
description = models.TextField(
max_length=200,
blank=True,
)
file = models.FileField(
upload_to='blog/%Y/%m/%d'
)
def __str__(self):
return self.name
@property
def filesize(self):
x = self.file.size
y = 512000
if x < y:
value = round(x/1000, 2)
ext = ' kb'
elif x < y*1000:
value = round(x/1000000, 2)
ext = ' Mb'
else:
value = round(x/1000000000, 2)
ext = ' Gb'
return str(value)+ext
Run Code Online (Sandbox Code Playgroud)
现在调用文件的大小很简单。
我分享这个是因为我希望这对某人有用。我要问的是:有更好的解决方案吗?
我有一个关于django cms 2.3.3的本地安装的问题:我已经通过pip安装它,在一个单独的virtualenv中.接下来我按照settings.py配置教程,启动了服务器.然后在管理员我创建了一个页面(主页),我试图通过cmsplugin_filer_image在占位符中添加一个图像,但上传似乎不起作用.这是我的settings.py:
# Django settings for cms1 project.
# -*- coding: utf-8 -*-
import os
gettext = lambda s: s
PROJECT_PATH = os.path.abspath(os.path.dirname(__file__))
DEBUG = True
TEMPLATE_DEBUG = DEBUG
ADMINS = (
# ('Your Name', 'your_email@example.com'),
)
MANAGERS = ADMINS
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
'NAME': 'cms1', # Or path to database file if using sqlite3.
'USER': 'cms', # Not used with sqlite3.
'PASSWORD': 'cms', # Not used with sqlite3. …Run Code Online (Sandbox Code Playgroud) 这是我的models.py:
def get_profileImage_file_path(instance, filename):
return os.path.join('%s/uploadedPhotos/profileImages' % instance.user_id, filename)
class UserExtended(models.Model):
user = models.OneToOneField(User)
profileImage = models.ImageField(upload_to=get_profileImage_file_path, default='/static/images/myProfileIcon.png')
Run Code Online (Sandbox Code Playgroud)
现在,我希望默认图像(在我的静态文件夹中)保存到给定的路径中
get_profileImage_file_path
Run Code Online (Sandbox Code Playgroud)
功能.在我的settings.py中,我将media_root和media_URL定义为:
MEDIA_ROOT = '/home/username/Documents/aSa/userPhotos'
MEDIA_URL = '/media/'
Run Code Online (Sandbox Code Playgroud)
出于某种原因,当我在模板和模板中传递用户对象时,如果我这样做:
<img class='profilePic' src="{{ user.userextended.profileImage.url }}" height='120px' alt="" />
Run Code Online (Sandbox Code Playgroud)
没有图像显示,当我打开chrome中的'inspect element'部分时,它会出现404错误:
GET http://127.0.0.1:8000/home/username/Documents/djcode/aS/aSa/static/images/myProfileIcon.png 404 (NOT FOUND)
Run Code Online (Sandbox Code Playgroud)
即使这是图像的正确文件路径.(我也不确定它为什么要提供整个文件路径,是不是它应该从/ static /开始?即使我'查看源',整个网址都在那里.)我怎样才能这样做位于静态文件夹中的默认图像上传到中提供的路径
get_profileImage_file_path
Run Code Online (Sandbox Code Playgroud)
功能?
为诸如此类的字段上传文件时:
file = FileField(upload_to='/path/')
Run Code Online (Sandbox Code Playgroud)
Django 使用 anInMemoryUploadedFile或TemporaryUploadedFile. 后者存储在磁盘上,可以通过temporary_file_path属性访问其文件名。存储选择取决于文件大小。
如何覆盖此行为并始终作为TemporaryUploadedFile此模型字段的a 上传?
我问这个的原因是因为我需要编写一个使用外部库的验证器,该库只能将文件路径作为输入,没有数据流。
问题如上所述。虽然有很多关于使用 django Rest 框架上传文件的教程。没有人提到它的可恢复版本。我需要在一个项目中实现它。有人可以向我指出一些资源或提供示例代码吗?非常感谢您的帮助。
更新
这是我到目前为止所得到的。
视图.py
class FileUploadView(views.APIView):
parser_classes = (FormParser, MultiPartParser)
def put(self, request, format=None):
file_obj = request.data['file']
self.handle_uploaded_file(file_obj)
return Response(status=204)
def handle_uploaded_file(self, ufile):
filename = "{0}/{1}".format(settings.MEDIA_ROOT, ufile)
with open(filename, "wb+") as target:
for chunk in ufile.chunks():
target.write(chunk)
Run Code Online (Sandbox Code Playgroud)
卷曲命令
curl -H "Content-Disposition: attachment; filename=try.py" -X PUT -F "file=@try.py" http://localhost:8000/api/fileupload/?filename=testing
Run Code Online (Sandbox Code Playgroud)
尝试.py
from django.test import TestCase
# Create your tests here.
Run Code Online (Sandbox Code Playgroud)
下一部分是如何使其可恢复。
我正在使用 boto3 将文件上传到 S3 并将其路径保存在 FileField 中。
class SomeFile(models.Model):
file = models.FileField(upload_to='some_folder', max_length=400, blank=True, null=True)
Run Code Online (Sandbox Code Playgroud)
对于上述模型,以下代码可用于创建记录。
ff = SomeFile(file='file path in S3')
ff.full_clean()
ff.save()
Run Code Online (Sandbox Code Playgroud)
现在,当我使用 ModelSerializer 执行相同操作时。
class SomeFileSerializer(serializers.ModelSerializer):
class Meta:
model = SomeFile
fields = ('file')
Run Code Online (Sandbox Code Playgroud)
运行下面的代码后出现此错误
rest_framework.exceptions.ValidationError: {'file': [ErrorDetail(string='提交的数据不是文件。请检查表单上的编码类型。', code='invalid')]}
serializer = SomeFileSerializer(data={'file': 'file path to S3'})
serializer.is_valid(raise_exception=True)
Run Code Online (Sandbox Code Playgroud)
我需要帮助来设置序列化器以接受文件路径,而无需实际拥有该文件。
django django-models django-file-upload django-serializer django-rest-framework
django ×9
python ×4
django-forms ×2
django-2.2 ×1
django-admin ×1
django-cms ×1
file-upload ×1
filefield ×1