我不确定我应该在这里还是在 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/