Python 如何手动将生成的文件分配给表单字段?

Python 如何手动将生成的文件分配给表单字段?,python,django,Python,Django,我一直在努力解决这个问题已经有一段时间了,我只是不明白它是如何工作的。我找到了一种将生成的文件直接导入模型的方法,但它不能很好地发挥作用,因为我还需要将文件上载到AmazonWeb服务。任何有助于我解决这一问题的解决方案都将不胜感激!在我的代码中,我向用户请求一个JSON文件,并使用它生成一个特定格式的文本文件。这既需要到达模型中的现场,也需要上传到AWS中的存储系统。 以下是我目前的看法: def sped_create(request): form = SpedForm(request.PO

我一直在努力解决这个问题已经有一段时间了,我只是不明白它是如何工作的。我找到了一种将生成的文件直接导入模型的方法,但它不能很好地发挥作用,因为我还需要将文件上载到AmazonWeb服务。任何有助于我解决这一问题的解决方案都将不胜感激!在我的代码中,我向用户请求一个JSON文件,并使用它生成一个特定格式的文本文件。这既需要到达模型中的现场,也需要上传到AWS中的存储系统。 以下是我目前的看法:

def sped_create(request):
form = SpedForm(request.POST, request.FILES, None)
# sped = get_object_or_404(Sped, pk=id)

if form.is_valid():
    data = json.load(form.cleaned_data['json_file'].open())
    # (json is successfully processed here: I've confirmed that the lines that would usually be here are irrelevant to the problem)
    f_txt = open(f"static/file_created_txt/bacon.txt", "w+", encoding='utf-8')  # FALTA ARRUMAR O DIRETÓRIO
    for string in fileTxt:
        f_txt.write(f"{string}\n")
    f_txt.close()
    instance = SpedForm(sped_file=request.FILES['static/file_created_txt/bacon.txt'])
    instance.save()
    sped = form.save()
    return redirect(sped_list)

return render(request, 'sped_form.html', {'form': form})
目前,我得到了以下回溯:

Environment:


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

Django Version: 2.2.7
Python Version: 3.7.3
Installed Applications:
['django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'materialize',
 'storages',
 'widget_tweaks',
 'core',
 'boto']
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']



Traceback:

File "C:\Users\Luís Gustavo\Desktop\Sped\.venv\lib\site-packages\django\utils\datastructures.py" in __getitem__
  78.             list_ = super().__getitem__(key)

During handling of the above exception ('static/file_created_txt/bacon.txt'), another exception occurred:

File "C:\Users\Luís Gustavo\Desktop\Sped\.venv\lib\site-packages\django\core\handlers\exception.py" in inner
  34.             response = get_response(request)

File "C:\Users\Luís Gustavo\Desktop\Sped\.venv\lib\site-packages\django\core\handlers\base.py" in _get_response
  115.                 response = self.process_exception_by_middleware(e, request)

File "C:\Users\Luís Gustavo\Desktop\Sped\.venv\lib\site-packages\django\core\handlers\base.py" in _get_response
  113.                 response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "C:\Users\Luís Gustavo\Desktop\Sped\.venv\lib\site-packages\django\contrib\auth\decorators.py" in _wrapped_view
  21.                 return view_func(request, *args, **kwargs)

File "C:\Users\Luís Gustavo\Desktop\Sped\core\views\sped.py" in sped_create
  66.         instance = SpedForm(sped_file=request.FILES['static/file_created_txt/bacon.txt'])

File "C:\Users\Luís Gustavo\Desktop\Sped\.venv\lib\site-packages\django\utils\datastructures.py" in __getitem__
  80.             raise MultiValueDictKeyError(key)

Exception Type: MultiValueDictKeyError at /sped_create/
Exception Value: 'static/file_created_txt/bacon.txt'

首先,如果定义了
fileTxt
,f_txt.write应该接收字节而不是str,那么问题
request.FILES
没有键
static/file\u created\u txt/bacon.txt
,也使用request.FILES.get而不是index,然后尝试将您创建的文件与以下内容关联:请您解释一下我如何传递字节,并演示如何使用request.FILES.get?我假设关于我必须说f_txt.write(string+“\n”)的字节,是这样吗?reques.FILES没有键
static/file\u created\u txt/bacon.txt
然后它用``request.FILES.get('static/file\u created\u txt/bacon.txt')引发
MultiValueDictKeyError
,如果键不存在,则不会引发该异常,但这并不能解决您的问题,我认为您应该在用f_txt写入内容后,在读取模式下重新打开,并将其传递给
SpeedForm(speed_file=f_txt)
或类似的不起作用的程序。sped_file不是表单接受的参数。但是如果您传递了该参数
instance=SpedForm(sped_file=request.FILES['static/file_created_txt/bacon.txt')