Ошибка NoReverseMatch при попытке перейти на страницу шаблона

При нажатии на элемент пользователь должен перейти на страницу, где есть дополнительная информация об этом элементе. Однако, когда я нажимаю на элемент, я получаю ошибку: NoReverseMatch: Reverse for 'listing' with arguments '('', '')' not found. 1 pattern(s) tried: ['(?P<id>[0-9]+)/(?P<name>[^/]+)/\\Z'].

Эта строка в моем шаблоне HTML выделена на странице ошибки: <a href="{% url 'listing' i.pk i.name %}">, но я не знаю почему. i.pk и i.name являются аргументами для функции views.py, которая вызывается listing и возвращает страницу (listing.html), содержащую дополнительную информацию об элементе. url должен быть в формате http://127.0.0.1:8000/ID/NAME_OF_ITEM, где ID - фактический id элемента, а NAME_OF_ITEM - фактическое имя элемента.

Как это исправить?

index.html:

{% for i in listings %}
    <div class="listing">
        <div class="info-container">
            <div class="top-info">
                <div class="listing-title">
                    <a href="{% url 'listing' i.pk i.name %}">
                        <h4>{{ i.name }}</h4>
                    </a>
                </div>
                <div class="listing-price">
                    <a href="{% url 'listing' i.pk i.name %}">
                        <strong>£{{ i.highest_bid }}</strong>
                    </a>
                </div>
            </div>
            <div class="listing-description">
                <a href="{% url 'listing' i.pk i.name %}">
                    <p>{{ i.description }}</p>
                </a>
            </div>
        </div>
    </div>
{% endfor %}

views.py:

def listing(request, id, name):
    listing = Listing.objects.get(pk=id)
    return render(request, 'auctions/listing.html', {
        'listings': Listing.objects.all(),
        'listing': listing
    })

urls.py:

path('<int:id>/<str:name>/', views.listing, name='listing')

listing.html:

<main>
    <div class="sing-container">
        <div class="sing-header">
            <h2> {{ listing.name }} </h2>
        </div>
    </div>
</main>
{% url 'listing' i.id i.name %}

В шаблоне страницы listing.html нет переменной i, поэтому i.id и i.name разрешаются в пустые строки. Но определение url для listing требует, чтобы эти значения были непустыми, поэтому возникает ошибка.

На странице index.html эти ссылки на переменные содержатся в цикле {% for i in listings %}, поэтому переменная i правильно существует на этой странице.

Но это не так на странице listing.html.

Честно говоря, я удивляюсь, почему эта страница вообще пытается показать эту ссылку, ведь это была бы просто ссылка на страницу, на которой вы уже находитесь.

Похоже, что вы создали шаблон страницы listing.html, скопировав страницу index.html, и просто забыли изменить некоторые вещи.

Я скопировал и вставил ссылку на изображение со страницы index.html, где есть цикл и i - текущее объявление в цикле. Однако на странице объявления нет цикла, поэтому нет i, так как он фокусируется только на одном объявлении.

Поэтому все, что содержит i.SOMETHING, неверно, так как компьютер не распознает i, поскольку его нет. Изображения обернуты в ссылки, которые ссылаются на текущую страницу: {{ url 'listing' i.id i.name }} и именно это вызывает ошибку.

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

Вернуться на верх