如何使用无效标识符作为 django 表单字段名称
Posted
技术标签:
【中文标题】如何使用无效标识符作为 django 表单字段名称【英文标题】:How to use non valid identifiers as django form field names 【发布时间】:2011-06-08 04:30:33 【问题描述】:我不确定是否应该在此处或在 serverfault 中发布此问题,因为它涉及 django 和 nginx 配置文件。
我有一个 django 视图,它从包含文件字段的表单接收 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 的标识符,任何其他字符都会破坏配置文件)
在这两种情况下有什么建议吗?
谢谢!
【问题讨论】:
【参考方案1】:好的,我想我找到了一种方法来回答我自己的问题,我希望它对某人有所帮助。
我用来处理提交的 POST 并带有一个名为“uploadedFile.name”的字段的表单看起来像这样:
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()
现在我们可以在视图中使用该表单并通过cleaned_data 访问uploadedFile.name 的数据,就像我们访问任何其他字段一样:
if request.method == "POST":
theForm = UploadForm(request.POST)
if theForm.is_valid():
theUploadedFileName=theForm.cleaned_data["uploadedFile.name"]
有效!
【讨论】:
以上是关于如何使用无效标识符作为 django 表单字段名称的主要内容,如果未能解决你的问题,请参考以下文章
Django - 如何在作为模型当前字段的模型表单上添加占位符?
Django:无法将空表单字段保存到数据库 - 以 10 为基数的 int() 的无效文字:''