2011-04-29 2 views
2

Je dois enregistrer des fichiers, pas à partir de request.FILES, mais à partir d'un autre enregistrement enregistré.Copier des fichiers d'un fichier FileField enregistré dans un fichier UploadedFile dans Django

Voici le code pour le record du modèle:

class Foo(models.Model) 
    slug = models.SlugField() 

class FooFile(models.Model): 
    name = models.CharField(max_length=100) 
    file = models.FileField(upload_to='foo_folder') 
    foo = models.ForeignKey(Foo, related_name='files') 

class RealRecord(models.Model): 
    slug = models.SlugField() 
    awesome_file=models.FileField(upload_to='awesome') 
    mediocre_file=models.FileField(upload_to='mediocre') 

Et la vue (dans ce cas MyForm est une forme de modèle qui permet d'économiser à RealRecord):

def example(request, record=1, template_name="form.html") 
    foo_obj = Foo.objects.get(pk=record) 
    SAVED_FILES = {} 
    for file in foo_obj.files.all(): 
     SAVED_FILES[file.name]=file.file 
    if request.method == 'POST': 
     form = MyForm(data=request.POST, files=SAVED_FILES) 
     if form.is_valid(): 
      form.save() 
      # rest of view 
    else: 
     form = MyForm() 
    return render(request, template_name, locals()) 

Donc, la chose est fondamentalement une FieldFile est utilisé comme objet UploadedFile.

Chaque Foo aura un FooFile enregistrement avec le nom awesome_file et un autre avec le nom mediocre_file, correspondant avec les champs obligatoires RealRecord.

La chose folle est, cela valide totalement. Cependant, le problème est que dans l'enregistrement résultant qui est créé, à la fois awesome_file et mediocre_file ont leur chemin dans "foo_folder". Mais je ne veux pas les fichiers dans "foo_folder", je veux qu'ils soient dans le chemin que j'ai spécifié pour chaque champ dans RealRecord.

Je suppose que je me demande ce que je peux faire pour les FieldFile valeurs provenant de FooField afin qu'ils se comportent comme un UploadedFile traditionnel et obtenir les upload_to et path valeurs de leurs champs respectifs.

Répondre

1

Awww ... vous les gars! J'espérais vraiment que quelqu'un trouverait une réponse. Quoi qu'il en soit, j'ai été capable de trouver ma propre solution; Je ne sais pas si c'est le meilleur mais ça marche.

J'ai fait un petit mod pour FooFile il stocke également le content_type du fichier téléchargé:

class FooFile(models.Model): 
    name = models.CharField(max_length=100) 
    file = models.FileField(upload_to='foo_folder') 
    content_type = models.CharField(max_length=254) # max length given by RFC 4288 
    foo = models.ForeignKey(Foo, related_name='files') 

puis, dans la vue, je crée un objet SimpleUploadedFile pour chaque FooFile enregistrement:

from django.core.files.uploadedfile import SimpleUploadedFile 
import os 

def example(request, record=1, template_name="form.html") 
    foo_obj = Foo.objects.get(pk=record) 
    SAVED_FILES = {} 
    for saved_file in foo_obj.files.all(): 
     SAVED_FILES[file.name]=SimpleUploadedFile(os.path.basename(saved_file.file.path), saved_file.file.read(), saved_file.content_type) 
    if request.method == 'POST': 
     form = MyForm(data=request.POST, files=SAVED_FILES) 
     if form.is_valid(): 
      form.save() 
      # rest of view 
    else: 
     form = MyForm() 
    return render(request, template_name, locals()) 
+0

Le code terminé est disponible sur github: https://github.com/JordanReiter/django-unauth-posting si quelqu'un le trouve utile, s'il vous plaît faites le moi savoir. Aussi, s'il vous plaît fourchez et améliorez-le! –

Questions connexes