Voici mon modèle. Ce que je veux faire, c'est générer un nouveau fichier et écraser l'existant chaque fois qu'une instance de modèle est enregistrée:
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)
Je vois beaucoup de documentation sur la façon de télécharger un fichier. Mais comment générer un fichier, l'assigner à un champ de modèle et faire en sorte que Django le stocke au bon endroit?
convert_to_pdf
commande de django-wkhtmltopdf . Je vous remercie!!f = open('/path/to/file', 'r')
pour le type de fichier ZIP,f = open('/path/to/file.zip', 'rb')
MEDIA_ROOT
n'a pas été partagé avec le même volume dans le céleri worker. Partager le volume nommé l'a corrigé ( ref ).La réponse acceptée est certainement une bonne solution, mais voici comment j'ai procédé pour générer un CSV et le servir à partir d'une vue.
J'ai pensé que cela valait la peine de mettre ceci ici car il m'a fallu un peu de bidouillage pour obtenir tout le comportement souhaitable (écraser le fichier existant, stocker au bon endroit, ne pas créer de fichiers en double, etc.).
Django 1.4.1
Python 2.7.3
la source
Il est recommandé d'utiliser un gestionnaire de contexte ou un appel
close()
en cas d'exceptions pendant le processus d'enregistrement du fichier. Cela peut se produire si votre backend de stockage est en panne, etc.Tout comportement d'écrasement doit être configuré dans votre backend de stockage. Par exemple, S3Boto3Storage a un paramètre
AWS_S3_FILE_OVERWRITE
. Si vous utilisez,FileSystemStorage
vous pouvez écrire un mixin personnalisé .Vous pouvez également appeler la méthode de sauvegarde du modèle au lieu de la méthode de sauvegarde du FileField si vous souhaitez que des effets secondaires personnalisés se produisent, comme les horodatages de la dernière mise à jour. Si tel est le cas, vous pouvez également définir l'attribut name du fichier sur le nom du fichier - qui est relatif à
MEDIA_ROOT
. Il utilise par défaut le chemin complet du fichier, ce qui peut causer des problèmes si vous ne le définissez pas - voir File .__ init __ () et File.name .Voici un exemple où se
self
trouve l'instance de modèle où semy_file
trouve le FileField / ImageFile, appelantsave()
l'ensemble de l'instance de modèle au lieu de seulement FileField:la source