Aqui está meu modelo. O que desejo fazer é gerar um novo arquivo e substituir o existente sempre que uma instância de modelo for salva:
class Kitten(models.Model):
claw_size = ...
license_file = models.FileField(blank=True, upload_to='license')
def save(self, *args, **kwargs):
#Generate a new license file overwriting any previous version
#and update file path
self.license_file = ???
super(Request,self).save(*args, **kwargs)
Vejo muita documentação sobre como fazer upload de um arquivo. Mas como faço para gerar um arquivo, atribuí-lo a um campo de modelo e fazer com que o Django o armazene no lugar certo?
fonte
convert_to_pdf
comando django-wkhtmltopdf . Obrigado!!f = open('/path/to/file', 'r')
para o tipo de arquivo ZIP,f = open('/path/to/file.zip', 'rb')
MEDIA_ROOT
não foi compartilhado com o mesmo volume no trabalhador de aipo. Compartilhar o volume nomeado corrigiu ( ref ).A resposta aceita é certamente uma boa solução, mas aqui está como fiz para gerar um CSV e exibi-lo a partir de uma visualização.
Achei que valia a pena colocar isso aqui, pois precisei mexer um pouco para obter todo o comportamento desejável (sobrescrever o arquivo existente, armazenar no local certo, não criar arquivos duplicados etc.).
Django 1.4.1
Python 2.7.3
fonte
É uma boa prática usar um gerenciador de contexto ou chamada
close()
em caso de exceções durante o processo de salvamento do arquivo. Pode acontecer se o back-end de armazenamento estiver inativo etc.Qualquer comportamento de substituição deve ser configurado em seu back-end de armazenamento. Por exemplo, S3Boto3Storage tem uma configuração
AWS_S3_FILE_OVERWRITE
. Se você estiver usando,FileSystemStorage
pode escrever um mixin personalizado .Você também pode querer chamar o método save do modelo em vez do método save do FileField se quiser que qualquer efeito colateral personalizado aconteça, como os carimbos de data / hora da última atualização. Se for esse o caso, você também pode definir o atributo name do arquivo como o nome do arquivo - que é relativo a
MEDIA_ROOT
. O padrão é o caminho completo do arquivo, o que pode causar problemas se você não configurá-lo - veja File .__ init __ () e File.name .Aqui está um exemplo onde
self
está a instância do modelo, ondemy_file
está o FileField / ImageFile, chamandosave()
toda a instância do modelo em vez de apenas FileField:fonte