Ошибка ValueEr в / books / results / - PullRequest
0 голосов
/ 20 апреля 2020

"Поле 'id' ожидало число, но получило 'results'."

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

Это было представление на основе классов ранее с использованием класса DetailView по умолчанию:

class BookDetailView(LoginRequiredMixin,DetailView):
    model = models.Book
    template_name='book_detail.html'
    login_url='login'

Это новая функция на основе подробного представления я изменил на:

@login_required
def book_detail(request,book_id):
    model =models.Book
    book=model.objects.get(id=book_id)
    template ='book_detail.html'
    owner =CustomUser.objects.get(username=book.owner)

    return render(request,template,{'book':book,'owner':owner})

Независимо от того, когда я пытаюсь go для подробного просмотра, он работает нормально. Но когда я пытаюсь выполнить поиск с использованием представления «book_search», возникает ошибка. Ранее функции поиска также работали нормально.

@login_required
def book_search(request):
    template ='book_list.html'
    model =models.Book
    query =request.GET.get('q')
    results =model.objects.exclude(owner =request.user).order_by('-available','-id')
    if query:
        results =results.filter(Q(title__icontains =query))

    paginator = Paginator(results, 9)
    page =request.GET.get('page')
    try:
        books =paginator.page(page)
    except PageNotAnInteger:
        books =paginator.page(1)
    except EmptyPage:
        books= paginator.page(paginator.num_pages)
    return render(request,template,{'books':books,'query':query,'page':page})

Это имеет отношение к результирующему набору, что представление поиска возвращает список книг, в то время как подробное представление требует только один идентификатор.

Редактировать: стек ошибок: -

ValueError: invalid literal for int() with base 10: 'results'

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "C:\Users\Dell\.virtualenvs\read_bus-VVRhbVr5\lib\site-packages\django\core\handlers\exception.py", line 34, in inner
    response = get_response(request)
  File "C:\Users\Dell\.virtualenvs\read_bus-VVRhbVr5\lib\site-packages\django\core\handlers\base.py", line 115, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "C:\Users\Dell\.virtualenvs\read_bus-VVRhbVr5\lib\site-packages\django\core\handlers\base.py", line 113, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "C:\Users\Dell\.virtualenvs\read_bus-VVRhbVr5\lib\site-packages\django\contrib\auth\decorators.py", line 21, in _wrapped_view
    return view_func(request, *args, **kwargs)
  File "C:\Users\Dell\Documents\read_bus\books\views.py", line 216, in book_detail
    book=results.get(id=book_id)
  File "C:\Users\Dell\.virtualenvs\read_bus-VVRhbVr5\lib\site-packages\django\db\models\query.py", line 404, in get
    clone = self._chain() if self.query.combinator else self.filter(*args, **kwargs)
  File "C:\Users\Dell\.virtualenvs\read_bus-VVRhbVr5\lib\site-packages\django\db\models\query.py", line 904, in filter
    return self._filter_or_exclude(False, *args, **kwargs)
  File "C:\Users\Dell\.virtualenvs\read_bus-VVRhbVr5\lib\site-packages\django\db\models\query.py", line 923, in _filter_or_exclude
    clone.query.add_q(Q(*args, **kwargs))
  File "C:\Users\Dell\.virtualenvs\read_bus-VVRhbVr5\lib\site-packages\django\db\models\sql\query.py", line 1337, in add_q
    clause, _ = self._add_q(q_object, self.used_aliases)
  File "C:\Users\Dell\.virtualenvs\read_bus-VVRhbVr5\lib\site-packages\django\db\models\sql\query.py", line 1365, in _add_q
    split_subq=split_subq, simple_col=simple_col,
  File "C:\Users\Dell\.virtualenvs\read_bus-VVRhbVr5\lib\site-packages\django\db\models\sql\query.py", line 1298, in build_filter
    condition = self.build_lookup(lookups, col, value)
  File "C:\Users\Dell\.virtualenvs\read_bus-VVRhbVr5\lib\site-packages\django\db\models\sql\query.py", line 1155, in build_lookup
    lookup = lookup_class(lhs, rhs)
  File "C:\Users\Dell\.virtualenvs\read_bus-VVRhbVr5\lib\site-packages\django\db\models\lookups.py", line 22, in __init__
    self.rhs = self.get_prep_lookup()
  File "C:\Users\Dell\.virtualenvs\read_bus-VVRhbVr5\lib\site-packages\django\db\models\lookups.py", line 72, in get_prep_lookup
    return self.lhs.output_field.get_prep_value(self.rhs)
  File "C:\Users\Dell\.virtualenvs\read_bus-VVRhbVr5\lib\site-packages\django\db\models\fields\__init__.py", line 1772, in get_prep_value
    ) from e

Ответы [ 2 ]

1 голос
/ 21 апреля 2020

Для этого detail_view:

URL должны выглядеть следующим образом:

urlpatterns =[
    path('book/<int:pk>',views.book_detail,name ='book_detail'),
    path('results/',views.book_search,name ='search'), 
]

В то время как функция представлений должна быть такой:

@login_required
def book_detail(request,book_id):
    model =models.Book
    book=model.objects.get(id=book_id)
    template ='book_detail.html'
    owner =CustomUser.objects.get(username=book.owner)

    return render(request,template,{'book':book,'owner':owner})

Передавая значение как http://127.0.0.1:8000/api/book/1

0 голосов
/ 21 апреля 2020

Кажется, я нашел решение.

На самом деле именно шаблон URL для book_detail вызывал проблему. Я создал его без использования преобразователя пути urls.py:

...
urlpatterns =[
    path('<book_id>/',views.book_detail,name ='book_detail'),
    path('results/',views.book_search,name ='search'), 
]

Я подумал, что достаточно просто использовать <book_id>, и, поскольку он выше в иерархии urlpatterns, он также соответствует «результатам». .

Смена пути на <int:book_id> сработала. Теперь я понял значение маленького преобразователя пути и никогда не забуду использовать его.

...