Django admin:仅当dateset字段包含在fieldset中时,渲染页面才能添加新对象失败

时间:2016-01-20 11:51:40

标签: python django datetime django-admin

我一直在研究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_nowauto_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导入日期,但添加它并没有帮助。我需要一种不同的方式来定义我的字段集才能正确处理日期吗?

1 个答案:

答案 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之后不存在),但这取决于您的用例。