我一直在研究Django应用程序,以取代我与一些朋友一起玩的基于电子表格的体育采摘游戏。我不久前定义了我的游戏模型,但最近添加了一个日期时间字段来表示游戏/匹配的开始时间:
class Game(models.Model):
home_team = models.CharField(max_length=100, default='---')
away_team = models.CharField(max_length=100, default='---')
spread = models.FloatField(default=0)
week = models.IntegerField(default=0)
home_team_score = models.IntegerField(default=0)
away_team_score = models.IntegerField(default=0)
start_time = models.DateTimeField(default='2015-09-01 13:00:00')
def has_started(self):
if datetime.now() >= self.start_time:
return True
return False
def __str__(self):
return '%s vs. %s, week: %i' % (self.home_team, self.away_team, self.week)
我刚注意到当我使用Django管理功能添加新游戏时,创建页面出错了。但是,如果我单击现有游戏,页面显示正常,我可以按预期编辑开始时间。
抛出的错误是:
AttributeError at /admin/app/game/add/
'str' object has no attribute 'date'
某些搜索返回了类似的问题,但是它们与将auto_now
或auto_now_add
定义为True
的日期时间字段相关,因此修复方法是确保它将这些字段处理为已读取 - 只。
这种情况不同,就好像我在admin.py中定义了一个自定义fieldset
,它没有包含时间字段,当我点击添加新的时,创建页面不会出错。例如:
class GameAdmin(admin.ModelAdmin):
fieldsets = [
('League week', {'fields': ['week'], }),
('Teams', {'fields': ['home_team', 'away_team'], }),
('Spread', {'fields': ['spread'], }),
]
list_filter = ['week']
search_fields = ['home_team','away_team']
这适用于添加新游戏,我可以回到默认的管理布局来更改默认时间。
我想我可能需要从datetime导入日期,但添加它并没有帮助。我需要一种不同的方式来定义我的字段集才能正确处理日期吗?
答案 0 :(得分:1)
将start_time
的默认属性设置为datetime.datetime
的对象,即datetime.datetime.now()
或在您的情况下
datetime.datetime(year=2015, month=9, day=1, hours=13)
虽然通过设置
将当前/动态时间用作default
被认为是一种良好做法
default = datetime.datetime.now
或
default = django.utils.timezone.now
对于时区感知日期时间(请参阅括号()在.now之后不存在),但这取决于您的用例。