DateTimeField 对象没有属性 strftime

DateTimeField object has no attribute strftime

我的主要代码是这样的:

  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

当我运行这段代码时,我得到:

'DateTimeField' object has no attribute 'strftime'

参考发布日期

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

我尝试转换为 datetime.datetime 但无济于事

编辑:看到答案后,我想我应该验证我正在尝试做什么

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

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

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

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

输出为:

File "C:\Users\[user]\AppData\Local\Programs\Python\Python38\lib\site-packages\django\db\models\fields\__init__.py", line 933, in value_from_object
    return getattr(obj, self.attname)
AttributeError: 'DateTimeField' object has no attribute 'attname'

在class级别,created_on是一个DateTimeField,不是datetime对象Post对象(不是 class)成立。如果你想添加一个格式化它的属性,你可以使用:

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

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

    # …

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

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

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

urlpatterns = [
    path('', views.PostList.as_view(), name='home'),
    path(
        <b>'<int:year>/<int:month></b>/<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(
            <b>created_on__year=self.kwargs['year']</b>,
            <b>created_on__month=self.kwargs['month']</b>
        )

在模板中,您可以 link 使用 post 对象的视图:

{% url 'post_detail' <b>post.created_on.year</b> <b>post.created_on.month</b> post.slug %}

在class级的属性上加一个self不就可以了吗?

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