Как в джанго получить время 'Europe/Moscow' при формировании url

Рейтинг: 1Ответов: 1Опубликовано: 27.08.2023
class Post(models.Model):
class Status(models.TextChoices):
    DRAFT = 'DF', 'Draft'
    PUBLISHED = 'PB', 'Published'

tags = TaggableManager()
title = models.CharField(max_length=250)
slug = models.SlugField(max_length=250, unique_for_date='publish')
author = models.ForeignKey(User,
                           on_delete=models.CASCADE,
                           related_name='blog_posts')
body = models.TextField()
publish = models.DateTimeField(default=timezone.now)
created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)
status = models.CharField(max_length=2,
                          choices=Status.choices,
                          default=Status.DRAFT)
objects = models.Manager()  # менеджер, применяемый по умолчанию
published = PublishedManager()  # конкретно-прикладной менеджер

class Meta:
    ordering = ['-publish']
    indexes = [
        models.Index(fields=['-publish']),
    ]

def __str__(self):
    return self.title

def get_absolute_url(self):
    return reverse('blog:post_detail',
                   args=[self.publish.year,
                         self.publish.month,
                         self.publish.day,
                         self.slug])

Есть такая модель. get_absolute_url - использует дату для создания url По часовым поясам в настройках (settings.py) выставил:

TIME_ZONE = 'Europe/Moscow'
USE_I18N = True
USE_TZ = True

Создаю пост в 0 часов 5 минут 27 августа. База данных PostgreSQL. Пост в таблице создается с датами: publish - "2023-08-27 00:04:12+03", created - "2023-08-27 00:04:14.98488+03", updated - "2023-08-27 00:04:14.98488+03". при этом get_absolute_url создает url вида /2023/8/26/hokkej-s-shajboj/, т.е. с 26 числом. В итоге получаю несуществующую страницу. Если в строке браузера изменить число на 27 - то пост отображается. Получается get_absolute_url получает из БД 26 число (UTC), а view - 27 ('Europe/Moscow'). Почему так происходит?

Ответы

▲ 1

Добавил в DATABASES

TIME_ZONE = 'Europe/Moscow'

помогло.