【问题标题】:DateTimeField object has no attribute strftimeDateTimeField 对象没有属性 strftime
【发布时间】:2021-01-01 16:43:21
【问题描述】:

我的主要代码是这样的:

  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 中的此网址:

   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'

【问题讨论】:

    标签: python django django-models django-urls


    【解决方案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<b>|date:'Y/m'</b> }}

    对于 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' <b>post.created_on.year</b> <b>post.created_on.month</b> post.slug %}

    【讨论】:

    • 读完之后,我想我应该澄清一下我的问题。请查看我的编辑
    • @Aknell:但这又不是模型的责任。 Django 使用模型-视图-模型视图架构。请尽量保持这些图层“干净”。
    【解决方案2】:

    不应该通过在类级别向属性添加self 来工作吗?

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

    【讨论】:

    • 试过了。没修好
    猜你喜欢
    • 1970-01-01
    • 2013-11-22
    • 2020-04-10
    • 2013-12-25
    • 2021-10-12
    • 1970-01-01
    • 1970-01-01
    • 2021-01-18
    • 2016-05-11
    相关资源
    最近更新 更多