期望是字符串、字节或类似于os.Path的对象,而不是NoneType。

8
我有一个代码,它应该基于登录用户的名称创建一个文件夹,并将他们上传的文件保存在该文件夹中。

我的问题是它会抛出这个错误代码

期望 str、bytes 或 os.PathLike 对象,而不是 NoneType

我的当前代码:

def user_directory_path(instance, filename):
    time_stamp = 'user_{0}/{1}'.format(instance.user, filename)
    createfolder = os.path.join('C:/Users/MyUser/Desktop/Project/', 'Fileuploads/', time_stamp,)
    if not os.path.exists(createfolder):
        os.makedirs(createfolder)

追踪:

Environment:


Request Method: POST Request URL: http://127.0.0.1:8000/callgolem/

Django Version: 2.0.4 Python Version: 3.6.5 Installed Applications: ['django.contrib.admin',  'django.contrib.auth',  'django.contrib.contenttypes',  'django.contrib.sessions',  'django.contrib.messages',  'django.contrib.staticfiles',  'callgolem'] Installed Middleware: ['django.middleware.security.SecurityMiddleware',  'django.contrib.sessions.middleware.SessionMiddleware',  'django.middleware.common.CommonMiddleware',  'django.middleware.csrf.CsrfViewMiddleware',  'django.contrib.auth.middleware.AuthenticationMiddleware',  'django.contrib.messages.middleware.MessageMiddleware',  'django.middleware.clickjacking.XFrameOptionsMiddleware']





File "C:\Users\wqe\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\core\handlers\exception.py" in inner
  35.             response = get_response(request)

File "C:\Users\wqe\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\core\handlers\base.py" in _get_response
  128.                 response = self.process_exception_by_middleware(e, request)

File "C:\Users\wqe\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\core\handlers\base.py" in _get_response
  126.                 response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "C:\Users\wqe\Desktop\GolemProject\callgolem\views.py" in index
  65.                 instance.save()

File "C:\Users\wqe\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\db\models\base.py" in save
  729.                        force_update=force_update, update_fields=update_fields)

File "C:\Users\wqe\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\db\models\base.py" in save_base
  759.             updated = self._save_table(raw, cls, force_insert, force_update, using, update_fields)

File "C:\Users\wqe\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\db\models\base.py" in _save_table
  842.             result = self._do_insert(cls._base_manager, using, fields, update_pk, raw)

File "C:\Users\wqe\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\db\models\base.py" in _do_insert
  880.                                using=using, raw=raw)

File "C:\Users\wqe\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\db\models\manager.py" in manager_method
  82.                 return getattr(self.get_queryset(), name)(*args, **kwargs)

File "C:\Users\wqe\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\db\models\query.py" in _insert
  1125.         return query.get_compiler(using=using).execute_sql(return_id)

File "C:\Users\wqe\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\db\models\sql\compiler.py" in execute_sql
  1283.             for sql, params in self.as_sql():

File "C:\Users\wqe\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\db\models\sql\compiler.py" in as_sql
  1236.                 for obj in self.query.objs

File "C:\Users\wqe\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\db\models\sql\compiler.py" in <listcomp>
  1236.                 for obj in self.query.objs

File "C:\Users\wqe\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\db\models\sql\compiler.py" in <listcomp>
  1235.                 [self.prepare_value(field, self.pre_save_val(field, obj)) for field in fields]

File "C:\Users\wqe\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\db\models\sql\compiler.py" in pre_save_val
  1185.         return field.pre_save(obj, add=True)

File "C:\Users\wqe\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\db\models\fields\files.py" in pre_save
  287.             file.save(file.name, file.file, save=False)

File "C:\Users\wqe\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\db\models\fields\files.py" in save
  86.         name = self.field.generate_filename(self.instance, name)

File "C:\Users\wqe\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\db\models\fields\files.py" in generate_filename
  306.         return self.storage.generate_filename(filename)

File "C:\Users\wqe\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\core\files\storage.py" in generate_filename
  97.         dirname, filename = os.path.split(filename)

File "C:\Users\wqe\AppData\Local\Programs\Python\Python36-32\lib\ntpath.py" in split
  205.     p = os.fspath(p)

Exception Type: TypeError at /callgolem/ Exception Value: expected str, bytes or os.PathLike object, not NoneType

4
请发布完整的回溯追踪信息。 - Willem Van Onsem
编辑帖子,附上Traceback。 - Phillip
你的路径正确吗?它似乎混合了Windows风格(C:)和Unix风格(文件夹之间的正斜杠/)。当使用print(createfolder)时,你是否得到了预期的路径? - Ralf
你发布的代码与错误回溯有何关联? - quamrana
它会打印出 C:/Users/wqe/Desktop/GolemProject/Fileuploads/user_phillip/file.zip。如果我在变量 createfolder 中加入反斜杠,Django 就会抛出异常。 - Phillip
@quamrana 如果这不是正确的事情,我很抱歉。我只是点击了大标题旁边的“切换到复制和粘贴视图”。Traceback - Phillip
2个回答

4
尝试将__init__.py文件添加到脚本文件夹中。

3
如果您能详细解释为什么认为这会解决问题,例如它是如何做到的,那么这可能会是更好的答案。 - Todd

1
当提出问题时,您应该发布所有相关的代码。在这种情况下,您发布了一个函数,没有任何上下文,并且回溯似乎与完全不同的内容相关。
然而,我认为我们可以猜测这个函数被分配为FileField或ImageField的upload_to参数。如果是这样,那么问题是您没有从函数中返回任何内容告诉Django实际上传文件的位置。您需要将文件名连接到目录并返回它:
return os.path.join(createfolder, filename)

3
在我的情况下,我忘记在我的包文件夹中添加__init__.py。类似于以下链接:https://github.com/flairNLP/flair/issues/374#issuecomment-549409160 - theTypan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接