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

У меня есть такая модель:

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

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

Вопрос в том, как правильно это сделать?

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

Благодарю.

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

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

code = models.FileField(null=True, blank=True)
Другие вопросы по тегам