【发布时间】:2017-05-15 18:10:34
【问题描述】:
我正在使用 Player 类扩展 Django (v1.9) 的内置用户模型,以添加一些额外的属性。
class Player(models.Model):
TIMEZONES=()
user = models.OneToOneField(User, on_delete=models.CASCADE)
... (player-specific properties here)
time_zone = models.CharField(max_length=255, choices=PRETTY_TIMEZONE_CHOICES, blank=True, null=True,)
从 Django 管理面板创建用户时,我并不总是需要创建播放器,所以有时只创建用户。因此,玩家 ID 和用户 ID 不完全匹配。事实证明,当填充链接到 Player 的模型的 ModelForms 时,这会导致一个问题,如下所示:
class City(models.Model):
player = models.ForeignKey(Player, on_delete=models.CASCADE)
name = models.CharField(max_length = 100)
x_coord = models.SmallIntegerField()
y_coord = models.SmallIntegerField()
region = models.CharField(max_length = 100)
def __unicode__(self):
return str(self.player) + "-" + str(self.name)
class Meta:
db_table = 'cities'
class CityForm(ModelForm):
class Meta:
model = City
fields = (
'name',
'player',
'x_coord',
'y_coord',
'region')
创建新城市时使用这个modelForm。当用户 ID 和玩家 ID 匹配时,没有问题,玩家 ID 被填充到表单中,并且城市创建成功。当用户ID和玩家ID不同时,表单中没有填写玩家ID,表单验证失败,城市创建失败。
我从 request.user 获取玩家 ID 没有问题,我可以在获取 POST 数据后验证之前修复玩家 ID。我还添加了一个保存后挂钩,以便始终创建 Player,因此 ID 将始终匹配。但似乎表单应该首先填充玩家 ID,因为用户数据是可访问的,并且是一对一的关系。
我在这里错过了什么?
【问题讨论】:
标签: python django django-forms modelform