Как получить элемент списка в качестве параметра 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 %}