[英]Django 1.8 - How to pre-populate a Model's field based on values in that Model's QuerySet
[英]how to populate a CreateView field based on count of model instances in Django
我有一個 model 供梯子上的玩家使用。
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,因為某些玩家可能已被刪除。
在 model 中,我嘗試使用變量作為默認值,但 Django 非常適合。 (NameError: name 'Player' is not defined)... 顯然是因為您不能在 Player 的 class 定義中引用 Player。
必須有一種“djangonista”的方式來做這個簡單的事情。
好吧,您可以通過覆蓋get_initial
在創建視圖中預填充表單:
class PlayerCreateView(CreateView):
model = Player
# ...
def get_initial(self):
initial = super().get_initial()
initial["ranking"] = Player.objects.count() # whatever formula
return initial
如果您想要 model 中的動態默認值,您可以將可調用對象指定為默認值:
def default_ranking():
return Player.objects.count()
class Player(models.Model):
ranking = models.IntegerField(default=default_ranking) # no parentheses!
但是,這不會填充表單字段,但只有在沒有排名值的情況下保存實例時才會生效。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.