Как получить элемент списка в качестве параметра url в django

Я пытаюсь использовать элемент списка в качестве параметра в теге URL в Django, но не могу его использовать.

Каждый раз выдает django.urls.exceptions.NoReverseMatch: Reverse for 'film_details' with no arguments not found. 1 pattern(s) tried: ['refs/film_details/(?P<pk>[^/]+)/$']. После долгих поисков я обнаружил, что существует проблема с доступом к элементу списка. Мой вопрос в том, как мне использовать элемент списка в качестве параметра в теге URL?

Функция просмотра

def search_field(request):
    search_text = request.POST.get('search')

    refs = Ref.objects.filter(title__icontains=search_text).values('id','title')
    year = ImdbFilm.objects.filter(year__icontains=search_text).values('title')
    filmNames = ImdbFilm.objects.filter(title__icontains=search_text).values('year','crew__name')
    
    results = list(chain(refs,year,filmNames))[:10]
    
    context = {'results': results}
    return render(request,'refs/search-results.html', context)

Тег URL

{% for film in results %}
    <li>
        <a href="{% url 'refs:film_details' film.id %}"> 
    </li>
{% endfor %}

файлurls.py

path("film_details/<str:pk>/", views.film_details, name="film_details")

Код в urls.py и в вашем html в порядке. В вашем views.py вы хотите получить результаты вашей модели Ref. Если у вас есть поле ForeignKey к ImdbFilm, то вы можете получить доступ ко всему ImdbFilm с помощью точечной нотации (также в шаблоне html).

Если вам нужно 10 результатов, вы также можете использовать пагинацию (https://pypi.org/project/django-pagination/) Возможно, эта функция может помочь:

def search_field(request):
    if request.method == "POST":
        searched = request.POST['searched']
        print(searched)
        results = Ref.objects.filter(title__icontains=search_text).order_by("whatever")
        # test fk:
        for ref in results:
            print(f'year={ref.imdb_film.year} name={ref.imdb_film.crew__name}'
            # this dot notation you can also do in your html's for loop if you do have a foreignkey to ImdbFilm.
    paginator = Paginator(list_all, 10)
    page_number = request.GET.get('page')
    ten_results = paginator.get_page(page_number)
    context = {"ten_results": ten_results}
    return render(request, 'refs/search-results.html', context)

html:

{% for film in ten_results %}
    <li>
        <a href="{% url 'refs:film_details' film.id %}"> 
    </li>
{% endfor %}
Вернуться на верх