J'ai le modèle suivant pour mes étudiants pour télécharger leurs tâches vers une application que je crée, mais j'ai un problème, j'ai besoin de passer une instance du modèle entre les vues, mais comme il n'est pas sérialisable, je ne peux pas l'enregistrer dans un attribut de session. Gardez à l'esprit que dans une vue, je crée l'objet sans l'enregistrer dans la base de données et dans l'autre, j'exécute des opérations avec l'objet et enfin je l'enregistre. Une idée de comment je peux faire ça?

from gdstorage.storage import GoogleDriveStorage

gd_storage = GoogleDriveStorage()

class Homework(models.Model):
    code = models.AutoField(primary_key=True)
    student = models.ForeignKey('Student', on_delete=models.PROTECT)
    title = models.CharField(unique=True, max_length=100)
    attached_file = models.FileField(upload_to='files/homeworks/', validators=[validate_file_size], storage=gd_storage)
1
pete 17 mars 2019 à 15:51

2 réponses

Meilleure réponse

La seule façon de conserver "l'état" entre les vues est d'enregistrer dans la base de données (ou tout autre stockage permanent). C'est ce que la session fait pour vous.

Si vous ne pouvez pas sérialiser pour enregistrer dans la session, vous n'avez pas d'autre choix que d'enregistrer un objet temporaire dans la base de données. Vous pouvez le marquer comme temporaire et ajouter un horodatage. Et dans la vue suivante, marquez-la comme engagée. Et si nécessaire, nettoyez de temps en temps, en supprimant les anciens objets temporaires.

Pour supprimer le fichier associé aux anciens objets temporaires, vous pouvez ajouter un gestionnaire de signal pour le signal post_delete:

from django.core.files.storage import default_storage

@receiver(post_delete, sender=Homework)
def remove_file(sender, instance, **kwargs)
    path = instance.attached_file.name
    if path:
        default_storage.delete(path)
3
dirkgroten 17 mars 2019 à 13:18