Объект «PlayerStatsForm» не имеет атрибута «имя пользователя» - PullRequest
1 голос
/ 13 мая 2019

Я создаю панель поиска, которая берет имя пользователя и находит этого игрока в базе данных.Я создаю PlayerStatsForm (), который принимает запрос, ищет в базе данных игроков с именем пользователя из запроса и возвращает статистику игроков.Я знаю, что имя пользователя передается формой html в мой код Python правильно, и форма передается true для PlayerStatsForm.is_valid (), но когда я пытаюсь вызвать playerstatsform.username, он говорит, что атрибут не найден.Если я добавляю модель = Player и изменяю формы. Форма в ModelForm в PlayerStatsForm пытается вставить игрока без имени пользователя или идентификатора в базу данных и говорит, что столбец user_id не может быть пустым

<tr><th><label for="id_username">Username:</label></th><td><input type="text" name="username" value="testuser" required id="id_username"></td></tr>
Internal Server Error: /elousers/elosearch/

Этоошибка терминала, поэтому проблема заключается в том, что id = id_username, а не name = id_username?

playerstatsform:


class PlayerStatsForm(forms.Form):
    username = forms.CharField()

    class Meta:
        fields = (
            'username',
        )

views.py:

def elosearch(request):
    if request.method == 'POST':
        print("Post was found")
        if 'get_player' in request.POST:
            playerstatsform = PlayerStatsForm(request.POST)
            print("post found")
            if playerstatsform.is_valid():
                player = Player.objects.get(name=playerstatsform.cleaned_data['username'])
                print("player found successfully")
                player_elo = player.elo
                player_name = player.name
                print(player_elo)
                context1 = {'playername': player_name, 'playerelo': player_elo}
                return render('elousers/elosearch.html', context1)
            else:
                invalid_player_entry = "Username not added. Please register below."
                context1 = {'invalid_player': invalid_player_entry}
                return render(request, 'elousers/elosearch.html', context1)
        elif 'addgame' in request.POST:
            gameform = GameForm(data=request.POST)
            if gameform.is_valid():
                gameform.save()
                game_success = "Game Successfully Added!"
                context2 = {'game_display': game_success}
                return render(request, 'elousers/elosearch.html', context2)
            else:
                game_invalid = "Invalid entry. Please try again."
                context2 = {'game_display': game_invalid}
                return render(request, 'elousers/elosearch.html', context2)
        else:
            return render(request, 'elousers/elosearch.html')
    elif request.method == 'GET':
        print("get was called")
        return render(request, 'elousers/elosearch.html')

ожидаютбаза данных для запроса с использованием имени пользователя, указанного в форме, но я получаю, что объект PlayerStatsForm не имеет атрибута 'username'

1 Ответ

0 голосов
/ 13 мая 2019

Вы можете получить значение из playerstatsform через атрибут .cleaned_data [Django-doc] , который является словарем. Используя playerstatsform.username, вы получите доступ к полю формы, но при этом вы получите HTML-представление поля, если вы передадите его через str.

def elosearch(request):
    if request.method == 'POST':
        print("Post was found")
        if 'get_player' in request.POST:
            playerstatsform = PlayerStatsForm(request.POST)
            if playerstatsform.is_valid():
                player = Player.objects.get(name=<b>playerstatsform.cleaned_data['username']</b>)
                player_elo = player.elo
                player_name = player.name
                context1 = {'playername': player_name, 'playerelo': player_elo}
                return render(request, 'elousers/elosearch.html', context1)

Обратите внимание, что возможно, что для данных name не существует объекта Player, или, возможно, если это поле не unique=True, несколько Player s могут иметь это имя, так что вы, вероятно, должны по крайней мере try - catch эти случаи, и обрабатывать их соответственно.

Таким образом, вам, вероятно, потребуется сделать что-то вроде:

def elosearch(request):
    if request.method == 'POST':
        print("Post was found")
        if 'get_player' in request.POST:
            playerstatsform = PlayerStatsForm(request.POST)
            if playerstatsform.is_valid():
                <b>try:</b>
                    player = Player.objects.get(
                        name=playerstatsform.cleaned_data['username']
                    )
                <b>except (Player.DoesNotExist, Player.MultipleObjectsReturned):</b>
                    player = None
                    player_elo = None
                    player_name = None
                <b>else:</b>
                    player_elo = player.elo
                    player_name = player.name
                context1 = {'playername': player_name, 'playerelo': player_elo}
                return render(request, 'elousers/elosearch.html', context1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...