Как передать объект между представлениями в Django - PullRequest
0 голосов
/ 17 марта 2019

У меня есть следующая модель для моих студентов, чтобы загрузить свои задачи в приложение, которое я создаю, но у меня есть проблема, мне нужно передать экземпляр модели между представлениями, но так как он не сериализуем, я могу не сохранять его в атрибуте сеанса. Имейте в виду, что в одном представлении я создаю объект, не сохраняя его в базе данных, а в другом я выполняю операции с объектом и, наконец, сохраняю его. Есть идеи, как мне это сделать?

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)

Ответы [ 2 ]

2 голосов
/ 17 марта 2019

Как говорит @dirkgroten, вы можете добавить в свою модель дополнительное поле, которое называется статусом, и по умолчанию присваивать ему значение временное.В дополнение к этому вы можете просмотреть код пакета .

Наконец, удалить файл на Google Диске в качестве бэкэнда хранилища очень просто.Используйте следующее

gd_storage.delete(name_file)

Поэтому измените код @ dirkgroten

from django.core.files.storage import default_storage

@receiver (post_delete, sender=Homework)
def remove_file (sender, instance, **kwargs):
    if instance.attached_file is not None:
        gd_storage.delete(instance.attached_file.name)
2 голосов
/ 17 марта 2019

Единственный способ сохранить «состояние» между представлениями - это сохранить в базу данных (или другое постоянное хранилище). Это то, что сессия делает для вас.

Если вы не можете выполнить сериализацию для сохранения в сеансе, у вас нет другого выбора, кроме как сохранить временный объект в базе данных. Вы можете пометить его как временный и добавить временную метку. И в следующем представлении пометьте его как совершенное. А при необходимости время от времени очищайте, удаляя старые временные объекты.

Чтобы удалить связанный файл со старыми временными объектами, вы можете добавить обработчик сигнала для сигнала 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)
...