Django - URL игрока не найден, несмотря на то, что он находится в urls.py - PullRequest
0 голосов
/ 04 декабря 2018

В течение последних нескольких дней я работал над созданием веб-приложения Django, позволяющего пользователям делать запросы в базе данных статистики MLB.У меня есть некоторые веб-приложения, работающие нормально, однако я попытался реализовать функцию поиска и столкнулся с проблемами с отображением URL.Я попытался уйти от этого и вместо этого работать над тем, чтобы заставить базу данных отображать информацию, основанную на ссылке на проигрыватель, на который они нажимают, но я сталкиваюсь с той же проблемой, когда URL-адрес динамический на основе player_id игрока.В этой части используется только модель People, для которой в качестве первичного ключа используется player_id.

В настоящее время у меня есть файл «allPlayers.html», в котором перечислены все игроки в базе данных вместе со ссылкой, которая отправляет player_id игрока наURL как:

allPlayers.html

{% extends "base_template.html" %}

{% block content %}
  <h1>MLB Stats All Players</h1>
  <p>Currently, there are : {{ num_players }} players listed in the database.</p>
  <table style="width:100%">
      <tr>
          <th>First Name</th>
          <th>Last Name</th>
          <th></th>
      </tr>
      {% for player in players %}
        <tr>
            <td>{{ player.name_first }}</td>
            <td>{{ player.name_last }}</td>
            <td>More on <a href="player/{{ player.player_id }}/">{{ player.name_first }} {{ player.name_last }}</a></td>
        </tr>
      {% endfor %}
  </table>

{% endblock %}

И соответствующее представление для 'allPlayers.html':

def allplayers(request):
    """View function for allPlayers page of site."""

    # Generate counts of people object
    num_players = People.objects.count()
    players = People.objects.all()

    context = {
        'num_players': num_players,
        'players': players,
    }

    # Render the HTML template allPlayers.html w/ data in context variable
    return render(request, 'allPlayers.html', context=context)

Только сВыше я успешно создал страницу в своем веб-приложении, в которой перечислены все игроки в базе данных вместе со ссылкой, и заметил, что я пытаюсь отправить player_id через <a href='players/{{ player.player_id }}>.В настоящее время часть allPlayers работает нормально.Однако дела идут на юг, когда я добавляю следующее playerInfo.html и соответствующее представление:

playerInfo.html

{% extends "base_template.html" %}

{% block content %}
  {% if results %}
    {% for player in results %}
      <p>{{ player.name_first }} {{ player.name_last }}</p>
    {% endfor %}
  {% endif %}
{% endblock %}

И представление:

def player(request, pk=None):
    if pk is not None:
      print('Hello world')
      print('pk :', pk)
      #instance = get_object_or_404(People, player_id=pk)
      results = People.object.filter(player_id=pk)
      context = {
        "results": results
      }
      return render(request, "playerInfo.html", context)
    else:
        print('Hello')
        return render(request, 'playerInfo.html')

Моя идея заключалась в том, что указанная ранее ссылка, содержащая {{ player.player_id }}, будет соответствовать следующему URL и помещать значение player_id в pk следующим образом, используя синтаксис <int:pk> вместо регулярного выражения:

polls / urls.py

urlpatterns = [
    path('', views.index, name='index'),
    path('allPlayers', views.allplayers, name='allplayers'),
    path('allTeams', views.allteams, name='allteams'),
    path('search/', views.search, name='search'),
    path('player/<int:pk>/', views.player, name='player'),
]

Однако, как только я перехожу на свою страницу «allPlayers» и нажимаю на одну из ссылок для игрока, скажем Хэнк Аарон (кто имеет player_id aaronha01), я получаю следующее Страница не найдена (404) ошибка:

Using the URLconf defined in baseballdb.urls, Django tried these URL patterns, in this order:

polls/ [name='index']
polls/ allPlayers [name='allplayers']
polls/ allTeams [name='allteams']
polls/ search/ [name='search']
polls/ player/<int:pk>/ [name='player']
admin/
The current path, polls/player/aaronha01/, didn't match any of these.

У меня проблемы с этим уже довольно много.Если у кого-то есть какой-либо совет и он может указать мне правильное направление, как я думаю об этом неправильно, или у меня есть решение, которое будет серьезно оценено!Спасибо.

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018

path('player/<int:pk>/' означает, что будет соответствовать только действительный int pk.Если ваш pk не int и что-то вроде действительного slug - используйте path('player/<slug:pk>/'.

docs: https://docs.djangoproject.com/en/2.1/topics/http/urls/#path-converters

И я предлагаю использовать {{ player.get_absolute_url }} или {% url 'player' player.id %} вместо создания URL-адреса вручную.

Отсутствие косой черты означает «отсюда», а не из корня сайта: https://webmasters.stackexchange.com/questions/56840/what-is-the-purpose-of-leading-slash-in-html-urls

0 голосов
/ 04 декабря 2018

Существует несоответствие между <int:pk> в вашем path(), который ожидает целое число, и вашим player_id, который представляет собой строку типа 'aaronha01'.

. Вы можете использовать pk вездеи иметь URL-адреса, такие как /player/17/:

path('player/<int:pk>/', views.player, name='player'),

def player(request, pk):
    instance = get_object_or_404(People, pk=pk)
    context = {
        "instance": instance,
    }
    return render(request, "playerInfo.html", context)

# Use pk in template when constructing URL
<td>More on <a href="/player/{{ player.pk }}/">{{ player.name_first }} {{ player.name_last }}</a></td>

Или вы можете использовать player_id везде, и иметь URL-адреса, такие как /player/aaronha01/.

path('player/<slug:player_id>/', views.player, name='player'),

def player(request, player_id):
    instance = get_object_or_404(People, player_id=player_id)
    context = {
        "instance": instance,
    }
    return render(request, "playerInfo.html", context)

# Use player_id in template when constructing URL
<td>More on <a href="/player/{{ player.player_id }}/">{{ player.name_first }} {{ player.name_last }}</a></td>

В качестве следующего улучшения выможно начать использовать тег {% url %}, чтобы вы больше не кодировали URL-адреса.

<a href="{% url "polls:player" player.player_id %}">

В приведенном выше примере я предположил, что в вашем polls/urls.py есть app_name='polls', и чтоВы решили использовать player_id вместо pk в своем шаблоне URL.

...