#python #django
#python #django
Вопрос:
Я получил модель / представление для проекта Story. Моя цель — дать только время для появления историй на моем веб-сайте.
class Story(models.Model):
...
...
image = models.ImageField(upload_to='story/')
created_on = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.title
def save(self):
super().save()
@property
def is_active(self):
#now = timezone.now()
if (self.created_on timedelta(days=10)) > datetime.now():
return False
return True
@method_decorator(login_required(login_url='/cooker/login'),name="dispatch")
class StoryList(generic.ListView):
queryset = Story.objects.order_by('-created_on')
template_name = 'user_list_story.html'
model = Story
Я получаю эту проблему:
не удается сравнить даты, зависящие от смещения, и даты, зависящие от смещения, поэтому я попытался исправить это для того же сравнения.
@property
def is_active(self):
now = timezone.now()
if (self.created_on timedelta(days=10)) > now:
return False
return True
Но на моей странице ничего не отображается. Вот шаблон кода.
{% for story in story_list %}
{% if story.is_active %}
{{ story.title }}
{% endif %}
{% endfor %}
Комментарии:
1. Вы установили
USE_TZ = True
вsettings.py
?2. Да, и я добавил из django.utils часовой пояс импорта в мои модели
3. каково значение created_on в вашей таблице, также почему бы вам не использовать filter в наборе запросов вместо этого
4. 2020-09-11 17:15:42.725268 10 дней больше, чем сейчас ()
5. @Louis: вы, вероятно, хотите поменять местами
True
иFalse
, поэтомуreturn self.created_on timedelta(days=10) > now
.
Ответ №1:
Нет необходимости выполнять эту проверку, вы можете отфильтровать набор запросов. Это более эффективно, поскольку фильтрация выполняется на стороне базы данных:
from django.contrib.auth.mixins import LoginRequiredMixin
from django.utils.timezone import now
class StoryList(LoginRequiredMixin, generic.ListView):
queryset = Story.objects.order_by('-created_on')
template_name = 'user_list_story.html'
model = Story
login_url = '/cooker/login'
def get_queryset(self, *args, **kwargs):
return super().get_queryset(*args, **kwargs).filter(
created_on__gte=now()-timedelta(days=10)
)
Примечание: Вы можете ограничить просмотры представлением на основе классов для аутентифицированных пользователей с помощью
LoginRequiredMixin
смешивание [Django-doc].