diff --git a/docs/api-guide/filtering.md b/docs/api-guide/filtering.md index 2771e6196..de3c2d020 100644 --- a/docs/api-guide/filtering.md +++ b/docs/api-guide/filtering.md @@ -83,6 +83,10 @@ We can override `.get_queryset()` to deal with URLs such as `http://example.com/ As well as being able to override the default queryset, REST framework also includes support for generic filtering backends that allow you to easily construct complex searches and filters. +Generic filters can also present themselves as HTML controls in the browsable API and admin API. + +![Filter Example](../img/filter-controls.png) + ## Setting filter backends The default filter backends may be set globally, using the `DEFAULT_FILTER_BACKENDS` setting. For example. diff --git a/docs/img/filter-controls.png b/docs/img/filter-controls.png new file mode 100644 index 000000000..4a41cf04f Binary files /dev/null and b/docs/img/filter-controls.png differ diff --git a/docs/index.md b/docs/index.md index bf849bd7b..676ad5204 100644 --- a/docs/index.md +++ b/docs/index.md @@ -12,9 +12,7 @@ --- -**Note**: This is the documentation for the **version 3.2** of REST framework. Documentation for [version 2.4](http://tomchristie.github.io/rest-framework-2-docs/) is also available. - -For more details see the 3.2 [announcement][3.2-announcement] and [release notes][release-notes]. +**Note**: This is the documentation for the **version 3** of REST framework. Documentation for [version 2](http://tomchristie.github.io/rest-framework-2-docs/) is also available. --- @@ -31,7 +29,7 @@ For more details see the 3.2 [announcement][3.2-announcement] and [release notes Django REST Framework

-Django REST framework is a powerful and flexible toolkit that makes it easy to build Web APIs. +Django REST framework is a powerful and flexible toolkit for building Web APIs. Some reasons you might want to use REST framework: @@ -52,13 +50,14 @@ Some reasons you might want to use REST framework: REST framework requires the following: -* Python (2.6.5+, 2.7, 3.2, 3.3, 3.4, 3.5) +* Python (2.7, 3.2, 3.3, 3.4, 3.5) * Django (1.7+, 1.8, 1.9) The following packages are optional: * [Markdown][markdown] (2.1.0+) - Markdown support for the browsable API. * [django-filter][django-filter] (0.9.2+) - Filtering support. +* [django-crispy-forms][django-crispy-forms] - Improved HTML display for filtering. * [django-guardian][django-guardian] (1.1.1+) - Object level permissions support. ## Installation @@ -203,6 +202,7 @@ General guides to using REST framework. * [3.0 Announcement][3.0-announcement] * [3.1 Announcement][3.1-announcement] * [3.2 Announcement][3.2-announcement] +* [3.3 Announcement][3.3-announcement] * [Kickstarter Announcement][kickstarter-announcement] * [Release Notes][release-notes] @@ -317,6 +317,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. [3.0-announcement]: topics/3.0-announcement.md [3.1-announcement]: topics/3.1-announcement.md [3.2-announcement]: topics/3.2-announcement.md +[3.3-announcement]: topics/3.3-announcement.md [kickstarter-announcement]: topics/kickstarter-announcement.md [release-notes]: topics/release-notes.md diff --git a/docs/topics/3.3-announcement.md b/docs/topics/3.3-announcement.md new file mode 100644 index 000000000..0f9223769 --- /dev/null +++ b/docs/topics/3.3-announcement.md @@ -0,0 +1,52 @@ +# Django REST framework 3.3 + +The 3.3 release marks the final work in the Kickstarter funded series. We'd like to offer a final resounding **thank you** to all our wonderful sponsors and supporters. + +The amount of work that has been achieved as a direct result of the funding is immense. We've added a huge amounts of new functionality, resolved nearly 2,000 tickets, and redesigned & refined large parts of the project. + +In order to continue + +--- + +## Release notes + +Significant new functionality in the 3.3 release includes: + +* Filters presented as HTML controls in the browsable API. +* A [forms API][forms-api], allowing serializers to be rendered as HTML forms. +* Django 1.9 support. +* A [`JSONField` serializer field][jsonfield], corresponding to Django 1.9's Postgres `JSONField` model field. +* Browsable API support [via AJAX][ajax-form], rather than server side request overloading. + +![Filter Controls](../img/filter-controls.png) + +*Example of the new filter controls* + +## Supported versions + +This release drops support for Django 1.5 and 1.6. Django 1.7, 1.8 or 1.9 are now required. + +This brings our supported versions into line with Django's [currently supported versions][django-supported-versions] + +## Deprecations + +The AJAX based support for the browsable API means that there are a number of internal cleanups in the `request` class. For the vast majority of developers this should largely remain transparent: + +* To support form based `PUT` and `DELETE`, or to support form content types such as JSON, you should now use the [AJAX forms][ajax-forms] javascript library. This replaces the previous 'method and content type overloading' that required significant internal complexity to the request class. +* The `accept` query parameter is no longer supported by the default content negotiation class. If you require it then you'll need to [use a custom content negotiation class](browser-enchancements.md#url-based-accept-headers). +* The custom `HTTP_X_HTTP_METHOD_OVERRIDE` header is no longer supported by default. If you require it then you'll need to [use custom middleware](browser-enchancements.md#http-header-based-method-overriding). + +The following pagination view attributes and settings have been moved into attributes on the pagination class since 3.1. Their usage was formerly deprecated, and has now been removed entirely, in line with the deprecation policy. + +* `view.paginate_by` - Use `paginator.page_size` instead. +* `view.page_query_param` - Use `paginator.page_query_param` instead. +* `view.paginate_by_param` - Use `paginator.page_size_query_param` instead. +* `view.max_paginate_by` - Use `paginator.max_page_size` instead. +* `settings.PAGINATE_BY` - Use `paginator.page_size` instead. +* `settings.PAGINATE_BY_PARAM` - Use `paginator.page_size_query_param` instead. +* `settings.MAX_PAGINATE_BY` - Use `paginator.max_page_size` instead. + +[forms-api]: html-and-forms.md +[ajax-form]: https://github.com/tomchristie/ajax-form +[jsonfield]: ../api-guide/serializer-fields.md#jsonfield +[django-supported-versions]: https://www.djangoproject.com/download/#supported-versions \ No newline at end of file diff --git a/rest_framework/pagination.py b/rest_framework/pagination.py index 45b5b29c5..8644bd881 100644 --- a/rest_framework/pagination.py +++ b/rest_framework/pagination.py @@ -186,63 +186,11 @@ class PageNumberPagination(BasePagination): invalid_page_message = _('Invalid page "{page_number}": {message}.') - def _handle_backwards_compat(self, view): - """ - Prior to version 3.1, pagination was handled in the view, and the - attributes were set there. The attributes should now be set on - the pagination class. The old style continues to work but is deprecated - and will be fully removed in version 3.3. - """ - assert not ( - getattr(view, 'pagination_serializer_class', None) or - getattr(api_settings, 'DEFAULT_PAGINATION_SERIALIZER_CLASS', None) - ), ( - "The pagination_serializer_class attribute and " - "DEFAULT_PAGINATION_SERIALIZER_CLASS setting have been removed as " - "part of the 3.1 pagination API improvement. See the pagination " - "documentation for details on the new API." - ) - - for (settings_key, attr_name) in ( - ('PAGINATE_BY', 'page_size'), - ('PAGINATE_BY_PARAM', 'page_size_query_param'), - ('MAX_PAGINATE_BY', 'max_page_size') - ): - value = getattr(api_settings, settings_key, None) - if value is not None: - setattr(self, attr_name, value) - warnings.warn( - "The `%s` settings key is deprecated. " - "Use the `%s` attribute on the pagination class instead." % ( - settings_key, attr_name - ), - DeprecationWarning, - ) - - for (view_attr, attr_name) in ( - ('paginate_by', 'page_size'), - ('page_query_param', 'page_query_param'), - ('paginate_by_param', 'page_size_query_param'), - ('max_paginate_by', 'max_page_size') - ): - value = getattr(view, view_attr, None) - if value is not None: - setattr(self, attr_name, value) - warnings.warn( - "The `%s` view attribute is deprecated. " - "Use the `%s` attribute on the pagination class instead." % ( - view_attr, attr_name - ), - DeprecationWarning, - ) - def paginate_queryset(self, queryset, request, view=None): """ Paginate a queryset if required, either returning a page object, or `None` if pagination is not configured for this view. """ - self._handle_backwards_compat(view) - page_size = self.get_page_size(request) if not page_size: return None diff --git a/rest_framework/settings.py b/rest_framework/settings.py index 9d834c125..adf737126 100644 --- a/rest_framework/settings.py +++ b/rest_framework/settings.py @@ -111,11 +111,6 @@ DEFAULTS = { 'COMPACT_JSON': True, 'COERCE_DECIMAL_TO_STRING': True, 'UPLOADED_FILES_USE_URL': True, - - # Pending deprecation: - 'PAGINATE_BY': None, - 'PAGINATE_BY_PARAM': None, - 'MAX_PAGINATE_BY': None }