Search code examples
pythondjangotastypiedjango-1.9

page() takes 1 positional argument but 2 were given


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 enter image description here

{
  "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?


Solution

  • 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.")