簡體   English   中英

如何根據 Django 中 model 實例的計數填充 CreateView 字段

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM