Как я могу создать заархивированный файл, сделанный из выбора FileFields / ImageFields, когда я сохраняю свой объект модели? - PullRequest
0 голосов
/ 03 марта 2019

edit : код для создания zip-файла и добавления его в мое поле zip_press_kit действительно работает, но я все еще не могу получить URL для его загрузки в моем шаблоне (см. Пункты 4 и5, чтобы увидеть, что добавляет)

1) У меня есть модель:

class Book(models.Model):
    ...
    press_kit = models.FileField(upload_to='press_kit/',
                                 verbose_name="Dossier de presse",
                                 blank=True,
                                 null=True,
                                 default=None)
    high_res_cover = models.ImageField(upload_to='high_res_covers/', 
                                 verbose_name="Couverture HD",
                                 blank=True)
    zip_press_kit = models.FileField(upload_to='zips/',
                                 blank=True,
                                 null=True)

Я просто дал поля, которые меня интересуют.Поэтому, когда я сохраняю свой новый объект Book в django-admin, я хочу проверить, есть ли у меня high_res_cover ИЛИ press_kit, и если это так, создайте zip_press_kit, который будет zip-файлом, содержащим high_res_coverи / или press_kit.

2) У меня есть метод сохранения:

   def save(self, *args, **kwargs):

    zip_file_name = f"{slugify(f'{self.title}-{self.id}')}.zip"

    if self.high_res_cover or self.press_kit:

        with ZipFile(f'{MEDIA_ROOT}zips/{zip_file_name}', 'w') as zip_file:

            if self.high_res_cover:
                zip_file.write(f'{MEDIA_ROOT}{self.high_res_cover}', os.path.basename(f'{MEDIA_ROOT}/{self.high_res_cover}'))

            if self.press_kit:
                zip_file.write(f'{MEDIA_ROOT}{self.press_kit}', os.path.basename(f'{MEDIA_ROOT}/{self.press_kit}'))

        self.zip_press_kit = File(open(f'{MEDIA_ROOT}/zips/{zip_file_name}', 'rb'))

        os.remove(f'{MEDIA_ROOT}/zips/{zip_file_name}')

    else:
        self.zip_press_kit = None

    super(Book, self).save(*args, **kwargs)

Этот код работает, когда моя книга уже существует, и я вызываю сохранить на ней, но когда я хочуполучить URL-адрес файла в моем шаблоне, я получаю что-то вроде 'localhost: 8000 / Users / me / Desktop / ProjectFIle ... /'.

3) Дерево проекта:

.
├── Entremonde
│   ├── __init__.py
│   ├── __pycache__
│   │   ├── __init__.cpython-37.pyc
│   │   ├── settings.cpython-37.pyc
│   │   ├── urls.cpython-37.pyc
│   │   └── wsgi.cpython-37.pyc
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
├── Pipfile
├── Pipfile.lock
├── __pycache__
│   └── manage.cpython-37.pyc
├── books
│   ├── __init__.py
│   ├── __pycache__
│   │   ├── __init__.cpython-37.pyc
│   │   ├── admin.cpython-37.pyc
│   │   ├── apps.cpython-37.pyc
│   │   ├── models.cpython-37.pyc
│   │   ├── urls.cpython-37.pyc
│   │   └── views.cpython-37.pyc
│   ├── admin.py
│   ├── apps.py
│   ├── management
│   │   ├── __init__.py
│   │   ├── __pycache__
│   │   │   └── __init__.cpython-37.pyc
│   │   └── commands
│   │       ├── __init__.py
│   │       ├── __pycache__
│   │       │   ├── __init__.cpython-37.pyc
│   │       │   └── books_init.cpython-37.pyc
│   │       └── books_init.py
│   ├── migrations
│   │   ├── 0001_initial.py
│   │   ├── 0002_book_display.py
│   │   ├── __init__.py
│   │   └── __pycache__
│   │       ├── 0001_initial.cpython-37.pyc
│   │       └── __init__.cpython-37.pyc
│   ├── models.py
│   ├── static
│   │   └── books
│   │       └── js
│   ├── templates
│   │   └── books
│   │       ├── authors.html
│   │       ├── book.html
│   │       └── catalogue.html
│   ├── tests.py
│   ├── urls.py
│   └── views.py
├── contacts
│   ├── __init__.py
│   ├── __pycache__
│   │   ├── __init__.cpython-37.pyc
│   │   ├── admin.cpython-37.pyc
│   │   ├── apps.cpython-37.pyc
│   │   ├── models.cpython-37.pyc
│   │   ├── urls.cpython-37.pyc
│   │   └── views.cpython-37.pyc
│   ├── admin.py
│   ├── apps.py
│   ├── migrations
│   │   ├── 0001_initial.py
│   │   ├── 0002_contact_postal_code.py
│   │   ├── __init__.py
│   │   └── __pycache__
│   │       ├── 0001_initial.cpython-37.pyc
│   │       ├── 0002_contact_postal_code.cpython-37.pyc
│   │       └── __init__.cpython-37.pyc
│   ├── models.py
│   ├── templates
│   │   └── contacts
│   │       ├── contacts.html
│   │       └── esapce-pro.html
│   ├── tests.py
│   ├── urls.py
│   └── views.py
├── db.json
├── manage.py
├── media
│   ├── covers
│   │   ├── ...
│   │   └── 25RUPTURE-Couverture_fisher_600px_web.jpg
│   ├── ebooks
│   ├── high_res_covers
│   │   └── HDj_tschichold-nouvelle_typo-couv.jpg
│   ├── posters_events
│   ├── press_kit
│   │   ├── ...
│   │   └── DPentremonde-dossierdepresse_fisher-2.pdf
│   └── zips
│       └── le-realisme-capitaliste-none.zip
├── news
│   ├── __init__.py
│   ├── __pycache__
│   │   ├── __init__.cpython-37.pyc
│   │   ├── admin.cpython-37.pyc
│   │   ├── apps.cpython-37.pyc
│   │   ├── models.cpython-37.pyc
│   │   ├── urls.cpython-37.pyc
│   │   └── views.cpython-37.pyc
│   ├── admin.py
│   ├── apps.py
│   ├── migrations
│   │   ├── 0001_initial.py
│   │   ├── __init__.py
│   │   └── __pycache__
│   │       ├── 0001_initial.cpython-37.pyc
│   │       └── __init__.cpython-37.pyc
│   ├── models.py
│   ├── templates
│   │   └── news
│   │       └── rencontres.html
│   ├── tests.py
│   ├── urls.py
│   └── views.py
├── static
│   ├── css
│   │   ├── authors.css
│   │   ├── elements.css
│   │   ├── entremonde-style.css
│   │   ├── font.css
│   │   └── style.css
│   └── js
│       ├── author.js
│       └── script.js
└── templates
    └── base.html

4) как я импортирую URL в моем шаблоне (также пробовал с book.zip_press_kit.url):

<div id="press-kits">
    {% for book in books_with_press_kit %}
        <a href="{{ book.zip_press_kit }}" class="e-font-large">{{ book.title }}</a><br>
    {% endfor %}
</div>

5) Что я получаю, когда нажимаю на ссылку:

Страница ненайдено (404) Метод запроса: GET URL запроса: http://localhost:8000/Users/pshop/Desktop/Entremonde/media/zips/le-realisme-capitaliste-2_QAeRykR.zip

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...