Проблемы с преобразованием строки в int в Django / Python - PullRequest
5 голосов
/ 16 сентября 2011

Я пытаюсь преобразовать строку в int, чтобы я мог сохранить промежуточный итог и хотел бы иметь возможность вывода в шаблоне django.

def stats(request):
    stats = []
    players = Player.objects.all()

    for player in players:
        player_stats = PlayerStat.objects.filter(player__id=player.pk)
        for n,stat in enumerate(player_stats):
            if n == 0: 
                    passing_completions = stat.passing_completions
            else:
                passing_completions += stat.passing_completions

        stats.append((player.first_name, player.last_name, player.team, passing_completions))

    return render_to_response('preps/stats.html', {'stats': stats, })

Я пытался добавить int() вокруг stat.passing_completions, но тогда это просто выдает ошибку invalid literal for int() with base 10: ''.

Итак, я использовал метод isdigit(), чтобы убедиться, что только строки с цифрами пытались преобразовать так:

for player in players:
    player_stats = PlayerStat.objects.filter(player__id=player.pk)

    for n,stat in enumerate(player_stats):
        if n == 0: 
            if stat.passing_completions.isdigit():
                passing_completions = int(stat.passing_completions)
        else:
            if stat.passing_completions.isdigit():
                passing_completions += int(stat.passing_completions)

    stats.append((player.first_name, player.last_name, player.team, passing_completions))

, но затем я получаю ошибку Caught TypeError while rendering: 'int' object is not iterable

Модель структуры

class PlayerStat(models.Model):
    player = models.ForeignKey(Player)

    week_num = models.CharField(
        max_length = 10,
        choices = (('1', 'Sep 2nd',), ('2', 'Sep 9th',), ('3', 'Sep 16th',),('4', 'Sep 23rd',), ('5', 'Sep 30th',), ('6', 'Nov 2nd',),('7', 'Nov 7th',), ('8', 'Nov 14th',), ('9', 'Nov 21st',),('10', 'Nov 28th',), ('11', 'Dec 4th',), ('12', 'Dec 11th',), ),
        blank = True,
        null=True
        )
    rushing_attempts = models.CharField(
        max_length = 100,
        verbose_name = "Rushing Attempts",
        blank=True
        )
    rushing_yards = models.CharField(
        max_length = 100,
        verbose_name = "Rushing Yards",
        blank=True
        )
    rushing_touchdowns = models.CharField(
        max_length = 100,
        verbose_name = "Rushing Touchdowns",
        blank=True
        )
    passing_completions = models.CharField(
        max_length = 100,
        verbose_name = "Passing Completions",
        blank=True
        )
    passing_attempts = models.CharField(
        max_length = 100,
        verbose_name = "Passing Attempts",
        blank=True
        )
    passing_yards = models.CharField(
        max_length = 100,
        verbose_name = "Passing Yards",
        blank=True
        )
    passing_touchdowns = models.CharField(
        max_length = 100,
        verbose_name = "Passing Touchdowns",
        blank=True
        )
    receptions = models.CharField(
        max_length = 100,
        verbose_name = "Receptions",
        blank=True
        )
    receiving_yards = models.CharField(
        max_length = 100,
        verbose_name = "Receiving Yards",
        blank=True
        )
    receiving_touchdowns = models.CharField(
        max_length = 100,
        verbose_name = "Receiving Touchdowns",
        blank=True
        )

Любая помощь будет оценена.

Спасибо

Ответы [ 3 ]

12 голосов
/ 16 сентября 2011

Я иногда использую этот глупый трюк:

 a = int('0' + someString)

Добавление нуля перед строкой гарантирует, что в строке будет как минимум "0". Теперь, чтобы быть уверенным, вы можете извлечь все цифры из «0» и someString с помощью регулярного выражения.

3 голосов
/ 15 июня 2012

Я знаю, что это старый вопрос, но если кому-то нужно, вот небольшое решение, которое я использую для преобразования строк в int без проблем:

def int_or_0(value):
    try:
        return int(value)
    except:
        return 0

Просто так.;)

2 голосов
/ 16 сентября 2011

Вам следует проверить, не является ли stat.passing_completions пустой строкой.Вы можете использовать:

for player in players:
    player_stats = PlayerStat.objects.filter(player__id=player.pk)
    for n,stat in enumerate(player_stats):
        if n == 0 and stat.passing_completions:  # n is 0 and passing_completions is something meaningful
                passing_completions = int(stat.passing_completions)
        elif stat_passing_completions:  # n is not 0
            passing_completions += int(stat.passing_completions)
        else:
            pass  # in this case, stat.passing_completions is an empty string ('')

    stats.append((player.first_name, player.last_name, player.team, passing_completions))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...