首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >结果位于/ ValueError /ValueError/

结果位于/ ValueError /ValueError/
EN

Stack Overflow用户
提问于 2020-04-21 04:39:05
回答 2查看 58关注 0票数 0

“字段'id‘需要一个数字,但得到了’results‘。”

在尝试对图书列表使用搜索筛选器时,我遇到了这个错误。在我将基于类的视图更改为基于函数的视图之前,它工作得很好。

这是之前使用默认DetailView类的基于类的视图:

代码语言:javascript
运行
复制
class BookDetailView(LoginRequiredMixin,DetailView):
    model = models.Book
    template_name='book_detail.html'
    login_url='login'

这是我更改为的新的基于函数的详细视图:

代码语言:javascript
运行
复制
@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})

当我尝试进入细节视图时,它工作得很好。但是当我尝试使用'book_search‘视图进行搜索时,它抛出了这个错误。以前,搜索功能也运行得很好。

代码语言:javascript
运行
复制
@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})

这与结果集有关,搜索视图返回一个图书列表,而详细视图只需要一个id。

编辑:错误堆栈:-

代码语言:javascript
运行
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-04-21 11:13:43

我似乎找到了解决方案。

实际上是'book_detail‘的url模式导致了这个问题。我在没有使用路径转换器urls.py的情况下创建它:

代码语言:javascript
运行
复制
...
urlpatterns =[
    path('<book_id>/',views.book_detail,name ='book_detail'),
    path('results/',views.book_search,name ='search'), 
]

我认为仅仅使用<book_id>就足够了,因为它在for模式的层次结构中更高,所以它的“结果”也是匹配的。

更改<int:book_id>的路径起作用了。现在我已经意识到了小路径转换器的重要性,并且永远不会忘记使用它。

票数 0
EN

Stack Overflow用户

发布于 2020-04-21 12:34:16

对于此detail_view:

URL应如下所示:

代码语言:javascript
运行
复制
urlpatterns =[
    path('book/<int:pk>',views.book_detail,name ='book_detail'),
    path('results/',views.book_search,name ='search'), 
]

而视图函数应该是这样的:

代码语言:javascript
运行
复制
@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传递

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61331645

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档