2011-01-12 2 views
2

Я не уверен, должен ли я опубликовать этот вопрос здесь или в serverfault, поскольку он включает файлы конфигурации django и nginx.Как использовать недействительные идентификаторы как имена полей формы django

У меня есть представление django, которое получает данные POST из формы, содержащей поля файла.

Запрос проходит через модуль nginx (модуль загрузки), который берет поля для загрузки файлов, сохраняет их на диске и добавляет дополнительные поля с локальным путем, где каждый файл может быть найден, вместе с их именами и другими метаданными , а затем удаляет исходные поля файла из POST.

Поля, которые прилагаются, к сожалению, не очень гибкие, и их имена содержат либо период (.), Либо тире (-).

Все это хорошо, но проблема возникает на стороне python. Если вы хотите проверить входящие данные POST с помощью формы, но я не знаю, как определить форму, в которой есть поля с именами, содержащими периоды или тире. Есть ли способ сообщить форме 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, любой другой символ разбивает конфигурационный файл)

Любые рекомендации в любом случае?

Спасибо!

ответ

3

Хорошо, я думаю, что нашел способ ответить на мой собственный вопрос, и я надеюсь, что это поможет кому-то.

Формы Я хотел бы использовать для обработки поданной POST с полем под названием «uploadedFile.name» будет выглядеть примерно так:

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

Что, конечно, не работает, так как мы не можем использовать период в идентификаторе (uploadedFile.name).

Ответ заключается в определении полой формы с использованием словаря класса Form, где мы можем назвать поля с красивой и произвольной строкой поля:

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() 

Теперь мы можем использовать эту форму в представлении и доступа к данным uploadedFile.name через cleaned_data как мы бы любой другой области:

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

Это работает!

Смежные вопросы