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')
我的主要代码是这样的:
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')