【问题标题】:TypeError: 'Player' object is not callable DjangoTypeError:“播放器”对象不可调用 Django
【发布时间】:2020-09-01 14:54:31
【问题描述】:

好吧,伙计们,我有这样的问题。 Django 为此类视图返回类型错误。它旨在成为游戏的回合系统:

@login_required
def game_end_turn(request, id):
    game = Game.objects.get(id=id)
    player = Player.objects.get(parent=request.user)
    if player == game.turn_of_player:
        game.turn_of_player = game.next_player()
        game.save()
        return redirect('detail', id=game.id)
    else:
        return redirect('detail',id=game.id)

型号:

class Game(models.Model):
    name = models.CharField(max_length=150)
    host = models.CharField(max_length=10)
    is_played = models.BooleanField(default = False)
    max_players = models.IntegerField(default=4)
    who_is_ready = models.ManyToManyField(Player, related_name="guys_ready", blank=True)
    who_is_playing = models.ManyToManyField(Player, related_name="guys_playing", blank=True)
    turn = models.IntegerField(default=1)
    turn_of_player = models.ForeignKey(Player, on_delete=models.CASCADE, related_name='czyja_tura', blank=True, null=True)

...以及它的方法:

  @property
    def how_many_players_playing(self):
        return self.who_is_playing.count()



     @property
        def players_playing(self):
            return list(self.who_is_playing.all())

 @property
    def next_player(self):
        x = self.players_playing.index(self.turn_of_player)
        nast= x+1
        if nast > self.how_many_players_playing:
            self.turn +=1
            self.save()
            return self.players_playing[0]
        else:
            return self.players_playing[x+1]

它以这样的错误结束:

TypeError: 'Player' 对象不可调用:

Traceback (most recent call last):
  File "/Users/dottore/PycharmProjects/CRUDE/venv/lib/python3.8/site-packages/django/core/handlers/exception.py", line 34, in inner
    response = get_response(request)
  File "/Users/dottore/PycharmProjects/CRUDE/venv/lib/python3.8/site-packages/django/core/handlers/base.py", line 115, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "/Users/dottore/PycharmProjects/CRUDE/venv/lib/python3.8/site-packages/django/core/handlers/base.py", line 113, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/Users/dottore/PycharmProjects/CRUDE/venv/lib/python3.8/site-packages/django/contrib/auth/decorators.py", line 21, in _wrapped_view
    return view_func(request, *args, **kwargs)
  File "/Users/dottore/PycharmProjects/Nowa_gra/Nova_gra/game/views.py", line 139, in game_end_turn
    game.turn_of_player = game.next_player()

Exception Type: TypeError at /game/2=end_turn
Exception Value: 'Player' object is not callable

为什么我不能分配那个播放器?请帮我。谢谢

【问题讨论】:

  • 请将完整的错误回溯添加到您的问题中。

标签: python django django-models typeerror


【解决方案1】:

由于next_player@property,因此您使用game.next_player 获取值,如果使用括号,您调用 Player 对象,但对象不是 可调用的(除非你实现了 __call__ 方法,但你没有,而且最好还是不要这样做)。

因此,您应该将该行重写为:

    game.turn_of_player = <b>game.next_player</b>  # <i>no</i> ()

【讨论】:

    猜你喜欢
    • 2021-10-29
    • 1970-01-01
    • 2012-06-04
    • 2010-11-26
    • 1970-01-01
    • 2020-08-26
    • 1970-01-01
    • 2012-08-17
    • 2019-08-12
    相关资源
    最近更新 更多