python - 如何使用无效标识符作为 Django 表单字段名称

标签 python django forms upload nginx

我不确定我应该在这里还是在 serverfault 中发布这个问题,因为它涉及到 django 和 nginx 配置文件。

我有一个 Django View ,它从包含文件字段的表单接收 POST 数据。

请求通过一个 nginx 模块(上传模块),该模块获取文件上传字段,将它们存储到磁盘位置,然后将额外的字段附加到可以找到每个文件的本地路径,以及它们的名称和其他元数据,然后从 POST 中删除原始文件字段。

不幸的是,附加的字段不是很灵活,它们的名称包含句点 (.) 或破折号 (-)。

一切都很好,但问题出在 python 端。如果想使用表单验证传入的 POST 数据,但我不知道如何定义一个表单,该表单的字段名称中包含句点或破折号。有没有办法告诉 Django 表单该字段的名称与用于存储它的变量不同?

我的解决方法是简单地不使用 django 表单并以另一种方式清理传入数据(如何?)。

或者如果有人在 nginx 中使用过上传模块并且知道如何使用指令

upload_set_form_field $upload_field_name.name "$upload_file_name";
upload_set_form_field $upload_field_name.content_type "$upload_content_type";
upload_set_form_field $upload_field_name.path "$upload_tmp_path";

以便 $upload_field_name.XXXX 附加字段不使用句点? (破折号有效,但这又会破坏 python 的标识符,任何其他字符都会破坏配置文件)

在这两种情况下有什么建议吗?

谢谢!

最佳答案

好的,我想我找到了一种方法来回答我自己的问题,我希望它能帮助别人。

我用来处理提交的带有名为“uploadedFile.name”的字段的 POST 的表单看起来像这样:

from django.forms import Form, fields
def UploadForm(Form):
 someField = fields.CharField()
 uploadedFile.name = fields.CharField()

这当然行不通,因为我们不能在标识符 (uploadedFile.name) 中使用句点。

答案是使用 Form 类的 fields 字典定义表单字段,我们可以在其中用一个漂亮的任意字符串命名字段:

def UploadForm(Form):
 someField = fields.CharField()
 def __init__(self, *args, **kwargs):
  #call our superclasse's initializer
  super(UploadForm,self).__init__(*args,**kwargs)
  #define other fields dinamically:
  self.fields["uploadedFile.name"]=fields.CharField()

现在我们可以在 View 中使用该表单,并像访问任何其他字段一样通过 cleaned_data 访问 uploadedFile.name 的数据:

if request.method == "POST":
 theForm = UploadForm(request.POST)
 if theForm.is_valid():
  theUploadedFileName=theForm.cleaned_data["uploadedFile.name"]

有效!

关于python - 如何使用无效标识符作为 Django 表单字段名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4675103/

相关文章:

python - 递归生成器

Python - 从Azure服务总线主题接收非常慢

html - 对齐不同长度的表单输入元素

javascript - 无法同时使用 2 个 javascript 表单函数

python - Weka python 包装器加载器

python替换文件行中的多个模式

python - 通过id获取对象时出现ValueError

python - 单个应用程序的 Django URL 路由

python - 在 Django REST ListAPI View 中对原始 SQL 查询进行分页的最佳方法?

javascript - Node.js : Make a response on the same page (update the page)