Задать вопрос
@ooker

Как правильно обратиться к функции в модели?

Привет.
Вопрос спецам. Хочу из шаблона убрать в модель условие.
models.py
master_promo_count = models.SmallIntegerField(default=0, verbose_name='Количество дней акции',)
 # СЧЕТЧИК АКЦИИ
    def promo(self, *args, **kwargs):
        self.master_promo_count = (self.master_date_end - datetime.today().date()).days
        return self.master_promo_count

    # Замена словаря в шаблоне
    def master_promo_count_day(self, *args, **kwargs):
        if self.promo(self, *args, **kwargs) == 1:
            return f'день'
        elif self.promo(self, *args, **kwargs) == 2:
            return f'дня'
        else:
            return f'дней'

html
<span class="red-text bb f18">{{ obj.promo }} {{ obj.master_promo_count_day }}</span></div>

Если делать вот так, то все работает.
# Замена словаря в шаблоне
    def master_promo_count_day(self):
        if self.master_promo_count == 1:
            return f'день'
        elif self.master_promo_count == 2:
            return f'дня'
        else:
            return f'дней'

Если обращаться к колонке к таблице все работает, если к первой функции то нет.
Кто поправит что не так делаю?
Спасибо.
  • Вопрос задан
  • 63 просмотра
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 1
fox_12
@fox_12 Куратор тега Django
Расставляю биты, управляю заряженными частицами
У вас вообще дичь с кодом...
Это:
master_promo_count = models.SmallIntegerField(default=0, verbose_name='Количество дней акции',)
 # СЧЕТЧИК АКЦИИ
    def promo(self, *args, **kwargs):
        self.master_promo_count = (self.master_date_end - datetime.today().date()).days
        return self.master_promo_count

легко меняется на это:
@property
def master_promo_count(self):
      return (self.master_date_end - datetime.today().date()).days


И тогда это будет работать:
def master_promo_count_day(self):
        if self.master_promo_count == 1:
            return f'день'
        elif self.master_promo_count == 2:
            return f'дня'
        else:
            return f'дней'

И вообще это:
<span class="red-text bb f18">{{ obj.promo }} {{ obj.master_promo_count_day }}</span></div>

как и master_promo_count_day - вообще через templatetags лучше сделать, если штатный pluralize не подходит
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы