我有一个梯子上玩家的模型。
class Player(models.Model):
# Availability choice list
available = 'AVL'
injured = 'INJ'
away = 'AWY'
retired = 'RET'
AVAILABILITY_CHOICES = [
(available, 'available'),
(injured, 'injured'),
(away, 'out of town'),
(retired, 'retired')
]
# Player fields
first = models.CharField('First Name', max_length=30)
last = models.CharField('Last Name', max_length=30)
cell = models.CharField('Cell Phone', max_length=12)
email = models.EmailField('Email') # changed field type
availability = models.CharField('Availability', choices = AVAILABILITY_CHOICES, \
max_length = 15, default='AVL')
ranking = models.IntegerField(default = 99)
我也在使用 CreateView 创建一个新的播放器。
class PlayerCreateView(CreateView):
model =Player
num_players = Player.objects.all().count()
print('There are {} players'.format(num_players))
context_object_name = 'player'
fields = ['ranking', 'first', 'last', 'cell', 'email', 'availability']
template_name = 'player_create.html'
success_url = reverse_lazy('players')
我不敢相信我会问这个(对 Django 来说还是新手),但我还没有找到一种方法来预填充玩家的排名字段。所以基本上我需要计算现有玩家的数量并填充排名字段。不能基于ID,因为部分玩家可能已被删除。
在模型中,我尝试使用默认变量,但 Django 失败了。 (NameError: name 'Player' is not defined) ...显然是因为你不能在 Player 的类定义中引用 Player。
必须有一种“djangonista”的方式来做这个简单的事情。
答案 0 :(得分:0)
好吧,您可以通过覆盖 get_initial
在创建视图中预填充表单:
class PlayerCreateView(CreateView):
model = Player
# ...
def get_initial(self):
initial = super().get_initial()
initial["ranking"] = Player.objects.count() # whatever formula
return initial
如果您想在模型中使用动态默认值,您可以指定一个 callable as default:
def default_ranking():
return Player.objects.count()
class Player(models.Model):
ranking = models.IntegerField(default=default_ranking) # no parentheses!
然而,这不会填写表单字段,但只有在没有排名值的情况下保存实例时才会生效。