DateTimeField对象没有属性strftime

时间:2020-09-14 23:40:21

标签: python django django-models django-urls

我的主要代码是这样:

static

运行此代码时,我得到:

  class Post(models.Model):
    title = models.CharField(max_length=200, unique=True)
    slug = models.SlugField(max_length=200, unique=True)
    author = models.ForeignKey(User, on_delete=models.CASCADE, related_name='blog_posts')
    updated_on = models.DateTimeField(auto_now=True)
    image = models.ImageField(upload_to='images/%Y/%m/%d/', blank=True)
    content = models.TextField()
    created_on = models.DateTimeField(auto_now_add=True)
    status = models.IntegerField(choices=STATUS, default=0)

    publishdate = created_on.strftime('%Y/%m')

    class Meta:
        ordering = ['-created_on']

    def __str__(self):
        return self.title

引用发布日期

strftime与datetime.datetime一起使用,并且DateTimeField转换为datetime.datetime,所以我在做什么错了?

我试图将datetime.datetime转换为无效

编辑:看到答案后,我认为我应该验证我要做什么

我正在尝试将日期添加到urls.py中的该URL:

'DateTimeField' object has no attribute 'strftime'

编辑2:我已将代码更新为此:

   urlpatterns = [
      path('', views.PostList.as_view(), name='home'),
      path('<publishdate>/<slug:slug>', views.PostDetail.as_view(), name='post_detail'
]

,输出为:

class Post(models.Model):
    title = models.CharField(max_length=200, unique=True)
    slug = models.SlugField(max_length=200, unique=True)
    author = models.ForeignKey(User, on_delete=models.CASCADE, related_name='blog_posts')
    updated_on = models.DateTimeField(auto_now=True)
    image = models.ImageField(upload_to='images/%Y/%m/%d/', blank=True)
    content = models.TextField()
    created_on = models.DateTimeField(auto_now_add=True)
    status = models.IntegerField(choices=STATUS, default=0)

    created_on_string = created_on.value_to_string(created_on)
    publishdate = strptime(created_on_string, '%Y/%m')

    class Meta:
        ordering = ['-created_on']

    def __str__(self):
        return self.title

2 个答案:

答案 0 :(得分:1)

在类级别,created_onDateTimeField,而不是datetime 对象(不是类)持有的Post对象。如果要添加格式化它的属性,可以使用:

class Post(models.Model):
    # …
    created_on = models.DateTimeField(auto_now_add=True)

    @property
    def publishdate(self):
        return self.created_on.strftime('%Y/%m')

    # …

话虽这么说,格式化数据通常不是模型的任务。模型用于存储表示数据。例如,在模板中,您可以使用|date template tag [Django-doc]以指定格式格式化datetime对象。例如,对于给定的Post对象post,您可以将其格式化为:

{{ post.created_on|date:'Y/m' }}

对于URL,您可以使用两个参数:

urlpatterns = [
    path('', views.PostList.as_view(), name='home'),
    path(
        '<int:year>/<int:month>/<slug:slug>',
        views.PostDetail.as_view(),
        name='post_detail'
    )
]

在您的视图中,然后进行以下过滤:

class PostDetail(DetailView):
    model = Post

    def get_queryset(self, *args, **kwargs):
        return super().get_queryset(*args, **kwargs).filter(
            created_on__year=self.kwargs['year'],
            created_on__month=self.kwargs['month']
        )

然后,您可以在模板中使用post对象链接到视图,

{% url 'post_detail' post.created_on.year post.created_on.month post.slug %}

答案 1 :(得分:0)

在类级别向属性添加self是否行得通?

publishdate = self.created_on.strftime('%Y/%m')