如何使用无效标识符作为 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 表单名称作为 HTML 模板中的属性

Django:无法将空表单字段保存到数据库 - 以 10 为基数的 int() 的无效文字:''

Django:如何在手动表单字段中显示模型的外键对象作为选择

更改 django 在显示表单错误消息时使用的字段名称

覆盖 Django 表单字段的名称 attr