Django Search возвращает страницу детального просмотра

в models.py

class Person(models.Model):
    name = models.CharField(max_length=100)
    age = models.IntegerField(blank=True, null=True)

в файле views.py

def index(request):
    entry = Person.objects.all()
    context = {'entry':entry}
    return render(request, 'searching/index.html', context)
    
def detail(request, pk):
    entry = Person.objects.get(id=pk)
    context = {'entry':entry}
    return render(request, 'searching/detail.html', context)

в urls.py

path('name/', views.index, name='index'),
path('name/<str:pk>/', views.detail, name='detail'),

Я застрял, я хочу сделать строку поиска, где если вы ищете точный id, например, моя модель имеет id 1, если я ищу 1 в поле, оно должно вернуть mysite.com/name/1 вместо того, чтобы получить страницу с результатами запросов, которые содержат 1, я хочу точный, который я искал.

Я так много искал, но не могу найти решение, это кажется простым вопросом, а я чувствую себя таким тупым. Есть ли простое решение, которое я упускаю?

Я думаю, что вы ищете способ перенаправления со страницы индекса с параметром поиска на страницу деталей. Если вы вставите в индексную страницу проверку, подобную этой, то теперь она будет принимать ID, переданный через поле поиска, и перенаправлять на эту страницу. Это оставит всю обработку ошибок, связанных с отсутствующими идентификаторами, на ваше представление detail.

from django.shortcuts import redirect

def index(request):
    pk = request.GET.get('q')  # /name/?q=1
    if pk:
        return redirect('detail', pk=pk)

    entry = Person.objects.all()
    context = {'entry': entry}
    return render(request, 'searching/index.html', context)

Вам нужно будет обновить 'q' до имени вашего поля поиска. Если имена ваших url находятся в пространстве имен, вам нужно добавить это в вызов redirect. Если ваша форма поиска отправляется с помощью <form method="POST">, вам нужно изменить request.GET на request.POST.

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