如何在Django表单字段中使用无效标识符

3 投票
1 回答
1429 浏览
提问于 2025-04-16 09:52

我不太确定这个问题是应该发在这里还是在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 个回答

8

好的,我想我找到了一个解决自己问题的方法,希望能对其他人有所帮助。

我用来处理提交的POST请求的表单,里面有一个叫“uploadedFile.name”的字段,应该长这样:

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

当然,这样是行不通的,因为在标识符中不能使用点(.),所以“uploadedFile.name”是不允许的。

解决办法是使用表单类的字段字典来定义表单字段,这样我们就可以用一个简单随意的字符串来命名字段:

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"]

这下可以用了!

撰写回答