Как передать год, месяц и дату в функции в созданный связанный каталог? - PullRequest
2 голосов
/ 30 мая 2019

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

def author_document_path(instance, filename):
    return f"documents/{ instance.author.username }/%y/%m/%d/{filename}"


def author_blog_images(instance, filename):
    return f"blog-images/{instance.author.username}/%y/%m/%d/{filename}"

class Blog(models.Model):
    title = models.CharField(max_length=255)
    # other fields
    thumbnail = models.ImageField(upload_to=author_blog_images)
    documents = models.FileField(upload_to=author_document_path)

Как правильно передать f"blog-images/{instance.author.username}/%y/%m/%d/{filename}" в двух вышеуказанных функциях, потому что эти функции не создают папки года как 2019, папки месяца как 5 и папки дня как 30. Каталоги выглядят так после загрузки соответствующих файлов и изображений :

enter image description here

это не то, что я хочу, я хочу, чтобы это выглядело так:

enter image description here

Можете ли вы помочь мне с этим. Большое вам спасибо.

1 Ответ

6 голосов
/ 30 мая 2019

Сначала вы выбираете текущий день, а затем можете получить атрибуты year, month и day, например:

from datetime import <b>date</b>

def author_blog_images(instance, filename):
    td = <b>date.today()</b>
    return f'blog-images/{instance.author.username}/{<b>td.year</b>}/{<b>td.month</b>}/{<b>td.day</b>}/{filename}'

Здесь td.month и td.day будут не с ведущими нулями (поэтому будет напечатано как 2019/5/30, не 2019/<b>0</b>5/30). Однако вы можете использовать начальные нули в строке формата, например:

from datetime import <b>date</b>

def author_blog_images(instance, filename):
    td = <b>date.today()</b>
    return f'blog-images/{instance.author.username}/{td.year}/{td.month<b>:02d</b>}/{td.day<b>:02d</b>}/{filename}'

или мы можем использовать конкретное форматирование даты:

from datetime import <b>date</b>

def author_blog_images(instance, filename):
    td = date.today().<b>strftime('%y/%b/%d')</b>
    return f'blog-images/{instance.author.username}/{<b>td</b>}/{filename}'

Мы также можем использовать, как @ BearBrown говорит , Джанго timezone.now [Django-doc] :

from django.utils import timezone

def author_blog_images(instance, filename):
    td = <b>timezone.now()</b>.strftime('%y/%b/%d')
    return f'blog-images/{instance.author.username}/{td}/{filename}'

мы можем даже вставить f-string в качестве параметра в strftime, например, @ chepner говорит для замены определенных частей ранее, а затем разрешить формат strftime time со строкой форматирования, созданной f-строкой:

from django.utils import timezone

def author_blog_images(instance, filename):
    return timezone.now().strftime(<b>f'</b>blog-images/{instance.author.username}/%y/%b/%d/{filename}<b>'</b>)

Однако здесь следует учитывать крайний случай: если instance.author.username или filename содержит элементы форматирования, такие как %d и %b, то strftime заменит их на день / месяц / ... соответственно. Хотя это не очень распространено, это то, что нужно учитывать.

Еще одна вещь, которую вы должны принять во внимание, это то, что при изменении author или username файл будет не переименован, поэтому он все равно будет содержать имя старого автора. (или старое имя пользователя этого автора).

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