保存模型对象时,如何创建由FileFields / ImageFields选择的压缩文件?

时间:2019-03-03 11:28:42

标签: django python-3.x django-models

编辑:创建zip文件并将其添加到我的zip_press_kit字段中的代码确实有效,但是我仍然无法获得将其下载到模板中的网址(请参见点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_coverpress_kit,如果有,请创建一个zip_press_kit包含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)

当我的书已经存在并且我在其上调用save时,此代码有效,但是当我想在模板中获取文件的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)如何在模板中导入网址(也尝试过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 请求网址:http://localhost:8000/Users/pshop/Desktop/Entremonde/media/zips/le-realisme-capitaliste-2_QAeRykR.zip

0 个答案:

没有答案