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.
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! –