Unexpected error: replace() takes 2 positional arguments but 3 were given

Unexpected error: replace() takes 2 positional arguments but 3 were given

在 settings.py 我有:

BASE_DIR = Path(__file__).resolve().parent.parent

那么在某些观点中:

from django.http import HttpResponse
from django.conf import settings


def test_view(request):
    return HttpResponse( settings.BASE_DIR.replace("src", "") )

这给出了错误:replace() takes 2 positional arguments but 3 were given

我很纳闷,那个错误是怎么出现的?如果这样做:

return HttpResponse( settings.BASE_DIR )

这个 returns 完整路径,类似于:/home/full/path/to/project/src

这也行

 return HttpResponse( "/home/full/path/to/project/src".replace("src", "") )

你能帮我看看这行有什么问题吗:

return HttpResponse( settings.BASE_DIR.replace("src", "") )

?

转换为string:

str(settings.BASE_DIR).replace("src", "")

您不是在调用 str 类型的 replace 方法,而是 pathlib 中的 Path class 方法之一(因为 BASE_DIR 是一个 Path 实例)。

它只需要两个参数(例如my_path.replace(target)),因此例外。

Docs here 关于它的作用(基本上是重命名文件或目录)。

将您的 Path 实例转换为字符串。

从 Django 3.1 BASE_DIR 默认设置为新 pathlib module Path object as documented

来自 source

BASE_DIR = Path(__file__).resolve().parent.parent

巧合的是 Path 也有 .replace() 方法,但它没有与字符串替换相同的用例

您可能想改用 parent 访问器:

settings.BASE_DIR.parent