2010-07-11 2 views
3

У меня есть модель, как это:Django FileField: как установить значение по умолчанию (автоматически создать пустой файл)?

class MyModel(models.Model): 
    name = models.CharField(max_length=255) 
    code = models.FileField() 

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

Вопрос: что такое Право Способ сделать это?

Я не мог найти что-либо в документах, поэтому я искал вручную редактирование запроса. ФАЙЛЫ перед подачей его в MyModelForm(), но это похоже на грязный взлом для меня ... Любые идеи?

Спасибо.

+0

Как вы планируете использовать значение, вводимое в поле кода? FileField не похож на подходящую. –

+0

Это файл с кодом Python, который затем запускается в безопасной среде выполнения. Сначала его нужно предварительно скомпилировать, поэтому его просмотр в отдельном файле выглядит наиболее удобным. – letoosh

+1

Мысль об этом откровенно дает мне завещания. это огромная дыра в безопасности. – eruciform

ответ

2

Я бы сохранил ввод кода в CharField, а затем создал отдельную функцию, которая обращается к модели, и если код не содержит каких-либо вредоносных методов, он затем записывается в файл.

Это касается создания файла (поскольку пустой CharField будет просто выведен в пустой файл) и позволяет делегировать проверку безопасности. Ваша установка будет выглядеть примерно так: Модель:

class MyModel(models.Model): 
    name = models.CharField(max_length=255) 
    code = models.CharField(MAX_FILE_LENGTH) 

Вид:

def Submit_Code(request): 
    #Create MyModel using POST data 
    process_input_file(NEWLY_CREATED_MODEL_NAME) 
    return HttpResponse("Upload Successful") 

def process_input_file(modelName): 
    #assuming unique name. Use "id=" instead if needed. 
    mm = MyModel.objects.get(name=modelName) 
    if passes_security_checks(mm.code): 
      f = open(mm.name, "r") 
      f.write(mm.code) 
      f.close() 

Редактировать Новый взгляд:

def Submit_Code(request): 
    mm = MyModel() 
    mm.name = request.POST.get('name') 
    f = open(mm.name,"r") 
    f.write(request.POST.get('code') 
    f.close() 
    #then associate the newly created file with the FileField however you want 
    #passing through authentication/checking if need be. 
    return HttpResponse("Upload Successful") 
+0

Я бы поместил код process_input_file в метод clean_code формы, таким образом обработав всю логику формы в одном месте. –

+0

Я думаю, что поле кода должно быть TextField вместо CharField. Я считаю, что CharField реализован как VARCHAR (255) в MySQL, и я предполагаю, что вы хотели бы иметь более 255 символов кода. –

+0

Это хорошая идея, но дублирование данных в CharField выглядит немного как перебор. На данный момент отправленный код проверяется в любом случае, поэтому я не вижу причины для его хранения отдельно. У меня уже есть все, что было реализовано, и я просто хочу, чтобы пользователи опускали поле кода, а затем редактировали его в браузере. Безопасное время выполнения полностью абстрагируется от экземпляра Django и не имеет доступа к БД или чему-либо еще. Таким образом, наличие кода в файле является, безусловно, лучшим способом. Наконец, ради других людей здесь было бы хорошо знать правильное решение. – letoosh

1

Просто установите поле, чтобы нуль и пустой. Это сделает поле необязательным.

code = models.FileField(null=True, blank=True) 
+0

Я не думаю, что это создаст пустой файл по желанию. –