Ok, tentei quase tudo e não consigo fazer isso funcionar.
- Eu tenho um modelo Django com um ImageField nele
- Eu tenho um código que baixa uma imagem via HTTP (testado e funciona)
- A imagem é salva diretamente na pasta 'upload_to' (o upload_to é aquele que está definido no ImageField)
- Tudo o que preciso fazer é associar o caminho do arquivo de imagem já existente ao ImageField
Eu escrevi este código sobre 6 maneiras diferentes.
O problema que eu estou enfrentando é que todo o código que estou escrevendo resulta no seguinte comportamento: (1) o Django cria um segundo arquivo, (2) renomeia o novo arquivo, adicionando um _ ao final do arquivo (3) não transfira nenhum dado, deixando basicamente um arquivo renomeado vazio. O que resta no caminho 'upload_to' são 2 arquivos, um que é a imagem real e outro que é o nome da imagem, mas está vazio, e é claro que o caminho ImageField é definido como o arquivo vazio que o Django tenta criar .
Caso isso não esteja claro, tentarei ilustrar:
## Image generation code runs....
/Upload
generated_image.jpg 4kb
## Attempt to set the ImageField path...
/Upload
generated_image.jpg 4kb
generated_image_.jpg 0kb
ImageField.Path = /Upload/generated_image_.jpg
Como posso fazer isso sem o Django tentar re-armazenar o arquivo? O que eu realmente gostaria é algo nesse sentido ...
model.ImageField.path = generated_image_path
... mas é claro que isso não funciona.
E sim, eu já passei por outras perguntas aqui, como esta , bem como o documento do django no arquivo
ATUALIZAÇÃO Após mais testes, ele só faz esse comportamento quando executado no Apache no Windows Server. Durante a execução no 'runserver' no XP, ele não executa esse comportamento.
Estou perplexo.
Aqui está o código que é executado com sucesso no XP ...
f = open(thumb_path, 'r')
model.thumbnail = File(f)
model.save()
fonte
Respostas:
Eu tenho algum código que busca uma imagem na web e a armazena em um modelo. Os bits importantes são:
Isso é um pouco confuso porque foi retirado do meu modelo e um pouco fora de contexto, mas as partes importantes são:
Deixe-me saber se você tiver dúvidas ou precisar de esclarecimentos.
Edit: por uma questão de clareza, eis o modelo (menos as instruções de importação necessárias):
fonte
import urlparse
.os.path.basename(urlparse.urlparse(self.url).path)
. Obrigado pelo post, foi útil.prohibited to prevent data loss due to unsaved related object 'stream'.
Super fácil se o modelo ainda não foi criado:
Primeiro , copie seu arquivo de imagem para o caminho de upload (assumido = 'path /' no seguinte snippet).
Segundo , use algo como:
testado e funcionando no django 1.4, ele também pode funcionar para um modelo existente.
fonte
Apenas uma pequena observação. A resposta tvon funciona, mas, se você estiver trabalhando no Windows, provavelmente desejará
open()
o arquivo'rb'
. Como isso:ou seu arquivo será truncado no primeiro
0x1A
byte.fonte
Aqui está um método que funciona bem e permite converter o arquivo para um determinado formato também (para evitar o erro "não é possível gravar o modo P como JPEG"):
onde image é o django ImageField ou your_model_instance.image, aqui está um exemplo de uso:
Espero que isto ajude
fonte
Ok, se tudo o que você precisa fazer é associar o caminho do arquivo de imagem já existente ao ImageField, esta solução pode ser útil:
Bem, se for sério, o arquivo de imagem já existente não será associado ao ImageField, mas a cópia desse arquivo será criada em upload_to dir como 'imgfilename.jpg' e será associado ao ImageField.
fonte
with open('/path/to/already/existing/file', 'rb') as f:
obj.save()
O que fiz foi criar meu próprio armazenamento que não salvará o arquivo no disco:
Em meus modelos, no ImageField, usei o novo armazenamento personalizado:
fonte
Se você quiser apenas "definir" o nome do arquivo real, sem incorrer na sobrecarga de carregar e salvar novamente o arquivo (!!), ou recorrer ao uso de um campo de caracteres (!!!), convém tentar algo como isto - -
Isso iluminará seu model_instance.myfile.url e todos os demais, como se você realmente tivesse carregado o arquivo.
Como @ t-stone diz, o que realmente queremos é ser capaz de definir instance.myfile.path = 'my-filename.jpg', mas o Django atualmente não suporta isso.
fonte
A solução mais simples na minha opinião:
fonte
Muitas dessas respostas estavam desatualizadas e passei muitas horas em frustração (sou bastante novo no Django & web dev em geral). No entanto, encontrei esta excelente essência de @iambibhas: https://gist.github.com/iambibhas/5051911
fonte
Esta pode não ser a resposta que você está procurando. mas você pode usar charfield para armazenar o caminho do arquivo em vez do ImageFile. Dessa forma, você pode associar programaticamente a imagem carregada ao campo sem recriar o arquivo.
fonte
Podes tentar:
fonte
fonte
fonte
Trabalhando! Você pode salvar a imagem usando o FileSystemStorage. veja o exemplo abaixo
fonte
Você pode usar a estrutura REST do Django e a biblioteca de solicitações python para salvar programaticamente a imagem no Django ImageField
Aqui está um exemplo:
fonte
Com o Django 3, com um modelo como este:
se a imagem já foi carregada, podemos fazer diretamente:
ou
fonte