page() takes 1 positional argument but 2 were given

北战南征 提交于 2019-12-24 01:44:58

问题


I am trying to design an api for search functionality. Search is based on place name.What i want is localhost:8000/api/v1/rent/search/?format=json&q="california" but i am getting an error which i have attached below

{
  "error_message": "page() takes 1 positional argument but 2 were given",
  "traceback": "Traceback (most recent call last):\n\n  File \"/home/tushant/.virtualenvs/rent/lib/python3.4/site-packages/tastypie/resources.py\", line 211, in wrapper\n    response = callback(request, *args, **kwargs)\n\n  File \"/home/tushant/Projects/rentals-v2.1/rentals/api/api.py\", line 102, in get_search\n    page = paginator.page(int(request.GET.get('page', 1)))\n\nTypeError: page() takes 1 positional argument but 2 were given\n"
}

my code for search api is

    from rentals.models import Rental,Gallery
    from django.core.paginator import InvalidPage
    from django.conf.urls import *
    from tastypie.paginator import Paginator
    from tastypie.exceptions import BadRequest
    from tastypie.resources import ModelResource
    from tastypie.utils import trailing_slash
    from haystack.query import SearchQuerySet
     class SearchResource(ModelResource):
        class Meta:
            queryset = Rental.objects.all()
            resource_name = 'rent'

    def prepend_urls(self):
        return [
            url(r"^(?P<resource_name>%s)/search%s$" % (self._meta.resource_name, trailing_slash()), self.wrap_view('get_search'), name="api_get_search"),
        ]

    def get_search(self, request, **kwargs):
        self.method_check(request, allowed=['get'])
        self.is_authenticated(request)
        self.throttle_check(request)

        # Do the query.
        sqs = SearchQuerySet().models(Rental).load_all().auto_query(request.GET.get('q', ''))
        paginator = Paginator(sqs, 20)

        try:
            page = paginator.page(int(request.GET.get('page', 1)))
        except InvalidPage:
            raise Http404("Sorry, no results on that page.")

        objects = []

        for result in page.object_list:
            bundle = self.build_bundle(obj=result.object, request=request)
            bundle = self.full_dehydrate(bundle)
            objects.append(bundle)

        object_list = {
            'objects': objects,
        }

        self.log_throttled_access(request)
        return self.create_response(request, object_list) 

my models.py is

class Rental(models.Model):
        city =  models.CharField(_("City"), max_length=255, blank=False,null=True,
            help_text=_("City of the rental space"))
        place =  models.CharField(_("Place"), max_length=255, blank=False,null=True,
            help_text=_("Place of the rental space"))

    class Gallery(models.Model):
        rental = models.ForeignKey('Rental', null=True, on_delete=models.CASCADE,verbose_name=_('Rental'), related_name="gallery")
        image = models.ImageField(blank=True,upload_to='upload/',null=True)

What am i missing?


回答1:


You're using a Tastypie Paginator class, which automatically detects the current page based on the requests passed in to it, unlike the Django Paginator class which requires you to pass in the page index.

Here's the code with relevant comments: https://github.com/django-tastypie/django-tastypie/blob/master/tastypie/paginator.py#L26

Try this:

    paginator = Paginator(request.GET, sqs, limit=20)

    try:
        page = paginator.page()
    except InvalidPage:
        raise Http404("Sorry, no results on that page.")


来源:https://stackoverflow.com/questions/36674181/page-takes-1-positional-argument-but-2-were-given

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!