Как использовать недопустимые идентификаторы в качестве имен полей формы Django - PullRequest
2 голосов
/ 13 января 2011

Я не уверен, стоит ли публиковать этот вопрос здесь или в сообщении 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 Ответ

4 голосов
/ 13 января 2011

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

Форма, которую я бы использовал для обработки отправленного 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"]

Работает!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...