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