Commit 67ddd54a by Tom Christie

Merge pull request #3226 from tomchristie/version-3.2

Version 3.2
parents 37b4d424 e3aaa323
......@@ -200,6 +200,7 @@ General guides to using REST framework.
* [Project management][project-management]
* [3.0 Announcement][3.0-announcement]
* [3.1 Announcement][3.1-announcement]
* [3.2 Announcement][3.2-announcement]
* [Kickstarter Announcement][kickstarter-announcement]
* [Release Notes][release-notes]
......@@ -312,6 +313,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
[third-party-resources]: topics/third-party-resources.md
[3.0-announcement]: topics/3.0-announcement.md
[3.1-announcement]: topics/3.1-announcement.md
[3.2-announcement]: topics/3.2-announcement.md
[kickstarter-announcement]: topics/kickstarter-announcement.md
[release-notes]: topics/release-notes.md
......
# Django REST framework 3.2
The 3.2 release is the first version to include an admin interface for the browsable API.
![The AdminRenderer](../img/admin.png)
This interface is intended to act as a more user-friendly interface to the API. It can be used either as a replacement to the existing `BrowsableAPIRenderer`, or used together with it, allowing you to switch between the two styles as required.
We've also fixed a huge number of issues, and made numerous cleanups and improvements.
Over the course of the 3.1.x series we've [resolved nearly 600 tickets](https://github.com/tomchristie/django-rest-framework/issues?utf8=%E2%9C%93&q=closed%3A%3E2015-03-05) on our GitHub issue tracker. This means we're currently running at a rate of **closing around 100 issues or pull requests per month**.
None of this would have been possible without the support of our wonderful Kickstarter backers. If you're looking for a job in Django development we'd strongly recommend taking [a look through our sponsors](http://www.django-rest-framework.org/topics/kickstarter-announcement/#sponsors) and finding out who's hiring.
## AdminRenderer
To include `AdminRenderer` simply add it to your settings:
REST_FRAMEWORK = {
'DEFAULT_RENDERER_CLASSES': [
'rest_framework.renderers.JSONRenderer',
'rest_framework.renderers.AdminRenderer',
'rest_framework.renderers.BrowsableAPIRenderer'
],
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
'PAGE_SIZE': 100
}
There are some limitations to the `AdminRenderer`, in particular it is not yet able to handle list or dictionary inputs, as we do not have any HTML form fields that support those.
Also note that this is an initial release and we do not yet have a public API for modifying the behavior or documentation on overriding the templates.
The idea is to get this released to users early, so we can start getting feedback and release a more fully featured version in 3.3.
## Deprecations
There are no new deprecations in 3.2, although a number of existing deprecations have now escalated in line with our deprecation policy.
* `request.DATA` was put on the deprecation path in 3.0. It has now been removed and its usage will result in an error. Use the more pythonic style of `request.data` instead.
* `request.FILES` was put on the deprecation path in 3.0. It has now been removed and its usage will result in an error. Use the more pythonic style of `request.files` instead.
* `request.QUERY_PARAMS` was put on the deprecation path in 3.0. It has now been removed and its usage will result in an error. Use the more pythonic style of `request.query_params` instead.
* The following `ModelSerializer.Meta` options have now been removed: `write_only_fields`, `view_name`, `lookup_field`. Use the more general `extra_kwargs` option instead.
The following pagination view attributes and settings have been moved into attributes on the pagination class since 3.1. Their usage was formerly in 'pending deprecation', and has now escalated to 'deprecated'. They will continue to function but will raise errors.
* `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 `max_page_size` instead.
## Modifications to list behaviors
There are a couple of bug fixes that are worth calling out as they introduce differing behavior.
These are a little subtle and probably won't affect most users, but are worth understanding before upgrading your project.
### ManyToMany fields and blank=True
We've now added an `allow_empty` argument, which can be used with `ListSerializer`, or with `many=True` relationships. This is `True` by default, but can be set to `False` if you want to disallow empty lists as valid input.
As a follow-up to this we are now able to properly mirror the behavior of Django's `ModelForm` with respect to how many-to-many fields are validated.
Previously a many-to-many field on a model would map to a serializer field that would allow either empty or non-empty list inputs. Now, a many-to-many field will map to a serializer field that requires at least one input, unless the model field has `blank=True` set.
Here's what the mapping looks like in practice:
* `models.ManyToManyField()``serializers.PrimaryKeyRelatedField(many=True, allow_empty=False)`
* `models.ManyToManyField(blank=True)``serializers.PrimaryKeyRelatedField(many=True)`
The upshot is this: If you have many to many fields in your models, then make sure you've included the argument `blank=True` if you want to allow empty inputs in the equivalent `ModelSerializer` fields.
### List fields and allow_null
When using `allow_null` with `ListField` or a nested `mant=True` serializer the previous behavior was to allow `null` values as items in the list. The behavior is now to allow `null` values instead of the list.
For example, take the following field:
NestedSerializer(many=True, allow_null=True)
Previously the validation behavior would be:
* `[{…}, null, {…}]` is **valid**.
* `null` is **invalid**.
Our validation behavior as of 3.2.0 is now:
* `[{…}, null, {…}]` is **invalid**.
* `null` is **valid**.
If you want to allow `null` child items, you'll need to instead specify `allow_null` on the child class, using an explicit `ListField` instead of `many=True`. For example:
ListField(child=NestedSerializer(allow_null=True))
## What's next?
The 3.3 release is currently planned for the start of October, and will be the last Kickstarter-funded release.
This release is planned to include:
* Search and filtering controls in the browsable API and admin interface.
* Improvements and public API for the admin interface.
* Improvements and public API for our templated HTML forms and fields.
* Nested object and list support in HTML forms.
Thanks once again to all our sponsors and supporters.
\ No newline at end of file
......@@ -38,6 +38,44 @@ You can determine your currently installed version using `pip freeze`:
---
## 3.2.x series
### 3.2.0
**Date**: [6th August 2015][3.2.0-milestone].
* Add `AdminRenderer`. ([#2926][gh2926])
* Add `FilePathField`. ([#1854][gh1854])
* Add `allow_empty` to `ListField`. ([#2250][gh2250])
* Support django-guardian 1.3. ([#3165][gh3165])
* Support grouped choices. ([#3225][gh3225])
* Support error forms in browsable API. ([#3024][gh3024])
* Allow permission classes to customize the error message. ([#2539][gh2539])
* Support `source=<method>` on hyperlinked fields. ([#2690][gh2690])
* `ListField(allow_null=True)` now allows null as the list value, not null items in the list. ([#2766][gh2766])
* `ManyToMany()` maps to `allow_empty=False`, `ManyToMany(blank=True)` maps to `allow_empty=True`. ([#2804][gh2804])
* Support custom serialization styles for primary key fields. ([#2789][gh2789])
* `OPTIONS` requests support nested representations. ([#2915][gh2915])
* Set `view.action == "metadata"` for viewsets with `OPTIONS` requests. ([#3115][gh3115])
* Support `allow_blank` on `UUIDField`. ([#3130][gh#3130])
* Do not display view docstrings with 401 or 403 response codes. ([#3216][gh3216])
* Resolve Django 1.8 deprecation warnings. ([#2886][gh2886])
* Fix for `DecimalField` validation. ([#3139][gh3139])
* Fix behavior of `allow_blank=False` when used with `trim_whitespace=True`. ([#2712][gh2712])
* Fix issue with some field combinations incorrectly mapping to an invalid `allow_blank` argument. ([#3011][gh3011])
* Fix for output representations with prefetches and modified querysets. ([#2704][gh2704], [#2727][gh2727])
* Fix assertion error when CursorPagination is provided with certains invalid query parameters. (#2920)[gh2920].
* Fix `UnicodeDecodeError` when invalid characters included in header with `TokenAuthentication`. ([#2928][gh2928])
* Fix transaction rollbacks with `@non_atomic_requests` decorator. ([#3016][gh3016])
* Fix duplicate results issue with Oracle databases using `SearchFilter`. ([#2935][gh2935])
* Fix checkbox alignment and rendering in browsable API forms. ([#2783][gh2783])
* Fix for unsaved file objects which should use `"url": null` in the representation. ([#2759][gh2759])
* Fix field value rendering in browsable API. ([#2416][gh2416])
* Fix `HStoreField` to include `allow_blank=True` in `DictField` mapping. ([#2659][gh2659])
* Numerous other cleanups, improvements to error messaging, private API & minor fixes.
---
## 3.1.x series
### 3.1.3
......@@ -225,6 +263,7 @@ For older release notes, [please see the version 2.x documentation][old-release-
[3.1.1-milestone]: https://github.com/tomchristie/django-rest-framework/issues?q=milestone%3A%223.1.1+Release%22
[3.1.2-milestone]: https://github.com/tomchristie/django-rest-framework/issues?q=milestone%3A%223.1.2+Release%22
[3.1.3-milestone]: https://github.com/tomchristie/django-rest-framework/issues?q=milestone%3A%223.1.3+Release%22
[3.2.0-milestone]: https://github.com/tomchristie/django-rest-framework/issues?q=milestone%3A%223.2.0+Release%22
<!-- 3.0.1 -->
[gh2013]: https://github.com/tomchristie/django-rest-framework/issues/2013
......@@ -382,3 +421,33 @@ For older release notes, [please see the version 2.x documentation][old-release-
[gh2618]: https://github.com/tomchristie/django-rest-framework/issues/2618
[gh3008]: https://github.com/tomchristie/django-rest-framework/issues/3008
[gh2695]: https://github.com/tomchristie/django-rest-framework/issues/2695
<!-- 3.2.0 -->
[gh1854]: https://github.com/tomchristie/django-rest-framework/issues/1854
[gh2250]: https://github.com/tomchristie/django-rest-framework/issues/2250
[gh2416]: https://github.com/tomchristie/django-rest-framework/issues/2416
[gh2539]: https://github.com/tomchristie/django-rest-framework/issues/2539
[gh2659]: https://github.com/tomchristie/django-rest-framework/issues/2659
[gh2690]: https://github.com/tomchristie/django-rest-framework/issues/2690
[gh2704]: https://github.com/tomchristie/django-rest-framework/issues/2704
[gh2712]: https://github.com/tomchristie/django-rest-framework/issues/2712
[gh2727]: https://github.com/tomchristie/django-rest-framework/issues/2727
[gh2759]: https://github.com/tomchristie/django-rest-framework/issues/2759
[gh2766]: https://github.com/tomchristie/django-rest-framework/issues/2766
[gh2783]: https://github.com/tomchristie/django-rest-framework/issues/2783
[gh2789]: https://github.com/tomchristie/django-rest-framework/issues/2789
[gh2804]: https://github.com/tomchristie/django-rest-framework/issues/2804
[gh2886]: https://github.com/tomchristie/django-rest-framework/issues/2886
[gh2915]: https://github.com/tomchristie/django-rest-framework/issues/2915
[gh2920]: https://github.com/tomchristie/django-rest-framework/issues/2920
[gh2926]: https://github.com/tomchristie/django-rest-framework/issues/2926
[gh2928]: https://github.com/tomchristie/django-rest-framework/issues/2928
[gh2935]: https://github.com/tomchristie/django-rest-framework/issues/2935
[gh3011]: https://github.com/tomchristie/django-rest-framework/issues/3011
[gh3016]: https://github.com/tomchristie/django-rest-framework/issues/3016
[gh3024]: https://github.com/tomchristie/django-rest-framework/issues/3024
[gh3115]: https://github.com/tomchristie/django-rest-framework/issues/3115
[gh3139]: https://github.com/tomchristie/django-rest-framework/issues/3139
[gh3165]: https://github.com/tomchristie/django-rest-framework/issues/3165
[gh3216]: https://github.com/tomchristie/django-rest-framework/issues/3216
[gh3225]: https://github.com/tomchristie/django-rest-framework/issues/3225
......@@ -55,5 +55,6 @@ pages:
- 'Project management': 'topics/project-management.md'
- '3.0 Announcement': 'topics/3.0-announcement.md'
- '3.1 Announcement': 'topics/3.1-announcement.md'
- '3.2 Announcement': 'topics/3.2-announcement.md'
- 'Kickstarter Announcement': 'topics/kickstarter-announcement.md'
- 'Release Notes': 'topics/release-notes.md'
......@@ -8,7 +8,7 @@ ______ _____ _____ _____ __
"""
__title__ = 'Django REST framework'
__version__ = '3.1.3'
__version__ = '3.2.0'
__author__ = 'Tom Christie'
__license__ = 'BSD 2-Clause'
__copyright__ = 'Copyright 2011-2015 Tom Christie'
......
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: Django REST framework\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-08-06 13:21+0100\n"
"PO-Revision-Date: 2015-08-06 12:21+0000\n"
"Last-Translator: Thomas Christie <tom@tomchristie.com>\n"
"Language-Team: English (Canada) (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/en_CA/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: en_CA\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: authentication.py:73
msgid "Invalid basic header. No credentials provided."
msgstr ""
#: authentication.py:76
msgid "Invalid basic header. Credentials string should not contain spaces."
msgstr ""
#: authentication.py:82
msgid "Invalid basic header. Credentials not correctly base64 encoded."
msgstr ""
#: authentication.py:100
msgid "Invalid username/password."
msgstr ""
#: authentication.py:103 authentication.py:191
msgid "User inactive or deleted."
msgstr ""
#: authentication.py:170
msgid "Invalid token header. No credentials provided."
msgstr ""
#: authentication.py:173
msgid "Invalid token header. Token string should not contain spaces."
msgstr ""
#: authentication.py:179
msgid ""
"Invalid token header. Token string should not contain invalid characters."
msgstr ""
#: authentication.py:188
msgid "Invalid token."
msgstr ""
#: authtoken/serializers.py:20
msgid "User account is disabled."
msgstr ""
#: authtoken/serializers.py:23
msgid "Unable to log in with provided credentials."
msgstr ""
#: authtoken/serializers.py:26
msgid "Must include \"username\" and \"password\"."
msgstr ""
#: exceptions.py:49
msgid "A server error occurred."
msgstr ""
#: exceptions.py:84
msgid "Malformed request."
msgstr ""
#: exceptions.py:89
msgid "Incorrect authentication credentials."
msgstr ""
#: exceptions.py:94
msgid "Authentication credentials were not provided."
msgstr ""
#: exceptions.py:99
msgid "You do not have permission to perform this action."
msgstr ""
#: exceptions.py:104 views.py:79
msgid "Not found."
msgstr ""
#: exceptions.py:109
msgid "Method \"{method}\" not allowed."
msgstr ""
#: exceptions.py:120
msgid "Could not satisfy the request Accept header."
msgstr ""
#: exceptions.py:132
msgid "Unsupported media type \"{media_type}\" in request."
msgstr ""
#: exceptions.py:145
msgid "Request was throttled."
msgstr ""
#: fields.py:167 relations.py:173 relations.py:206 validators.py:79
#: validators.py:162
msgid "This field is required."
msgstr ""
#: fields.py:168
msgid "This field may not be null."
msgstr ""
#: fields.py:504 fields.py:532
msgid "\"{input}\" is not a valid boolean."
msgstr ""
#: fields.py:567
msgid "This field may not be blank."
msgstr ""
#: fields.py:568 fields.py:1482
msgid "Ensure this field has no more than {max_length} characters."
msgstr ""
#: fields.py:569
msgid "Ensure this field has at least {min_length} characters."
msgstr ""
#: fields.py:606
msgid "Enter a valid email address."
msgstr ""
#: fields.py:617
msgid "This value does not match the required pattern."
msgstr ""
#: fields.py:628
msgid ""
"Enter a valid \"slug\" consisting of letters, numbers, underscores or "
"hyphens."
msgstr ""
#: fields.py:640
msgid "Enter a valid URL."
msgstr ""
#: fields.py:653
msgid "\"{value}\" is not a valid UUID."
msgstr ""
#: fields.py:687
msgid "Enter a valid IPv4 or IPv6 address."
msgstr ""
#: fields.py:712
msgid "A valid integer is required."
msgstr ""
#: fields.py:713 fields.py:748 fields.py:781
msgid "Ensure this value is less than or equal to {max_value}."
msgstr ""
#: fields.py:714 fields.py:749 fields.py:782
msgid "Ensure this value is greater than or equal to {min_value}."
msgstr ""
#: fields.py:715 fields.py:750 fields.py:786
msgid "String value too large."
msgstr ""
#: fields.py:747 fields.py:780
msgid "A valid number is required."
msgstr ""
#: fields.py:783
msgid "Ensure that there are no more than {max_digits} digits in total."
msgstr ""
#: fields.py:784
msgid ""
"Ensure that there are no more than {max_decimal_places} decimal places."
msgstr ""
#: fields.py:785
msgid ""
"Ensure that there are no more than {max_whole_digits} digits before the "
"decimal point."
msgstr ""
#: fields.py:899
msgid "Datetime has wrong format. Use one of these formats instead: {format}."
msgstr ""
#: fields.py:900
msgid "Expected a datetime but got a date."
msgstr ""
#: fields.py:965
msgid "Date has wrong format. Use one of these formats instead: {format}."
msgstr ""
#: fields.py:966
msgid "Expected a date but got a datetime."
msgstr ""
#: fields.py:1030
msgid "Time has wrong format. Use one of these formats instead: {format}."
msgstr ""
#: fields.py:1085
msgid "Duration has wrong format. Use one of these formats instead: {format}."
msgstr ""
#: fields.py:1110 fields.py:1154
msgid "\"{input}\" is not a valid choice."
msgstr ""
#: fields.py:1155 fields.py:1301 relations.py:405 serializers.py:504
msgid "Expected a list of items but got type \"{input_type}\"."
msgstr ""
#: fields.py:1156
msgid "This selection may not be empty."
msgstr ""
#: fields.py:1194
msgid "\"{input}\" is not a valid path choice."
msgstr ""
#: fields.py:1213
msgid "No file was submitted."
msgstr ""
#: fields.py:1214
msgid ""
"The submitted data was not a file. Check the encoding type on the form."
msgstr ""
#: fields.py:1215
msgid "No filename could be determined."
msgstr ""
#: fields.py:1216
msgid "The submitted file is empty."
msgstr ""
#: fields.py:1217
msgid ""
"Ensure this filename has at most {max_length} characters (it has {length})."
msgstr ""
#: fields.py:1263
msgid ""
"Upload a valid image. The file you uploaded was either not an image or a "
"corrupted image."
msgstr ""
#: fields.py:1302 relations.py:406 serializers.py:505
msgid "This list may not be empty."
msgstr ""
#: fields.py:1346
msgid "Expected a dictionary of items but got type \"{input_type}\"."
msgstr ""
#: pagination.py:192
msgid "Invalid page \"{page_number}\": {message}."
msgstr ""
#: pagination.py:459
msgid "Invalid cursor"
msgstr ""
#: relations.py:174
msgid "Invalid pk \"{pk_value}\" - object does not exist."
msgstr ""
#: relations.py:175
msgid "Incorrect type. Expected pk value, received {data_type}."
msgstr ""
#: relations.py:207
msgid "Invalid hyperlink - No URL match."
msgstr ""
#: relations.py:208
msgid "Invalid hyperlink - Incorrect URL match."
msgstr ""
#: relations.py:209
msgid "Invalid hyperlink - Object does not exist."
msgstr ""
#: relations.py:210
msgid "Incorrect type. Expected URL string, received {data_type}."
msgstr ""
#: relations.py:369
msgid "Object with {slug_name}={value} does not exist."
msgstr ""
#: relations.py:370
msgid "Invalid value."
msgstr ""
#: serializers.py:310
msgid "Invalid data. Expected a dictionary, but got {datatype}."
msgstr ""
#: templates/rest_framework/horizontal/radio.html:2
#: templates/rest_framework/inline/radio.html:2
#: templates/rest_framework/vertical/radio.html:2
msgid "None"
msgstr ""
#: templates/rest_framework/horizontal/select_multiple.html:2
#: templates/rest_framework/inline/select_multiple.html:2
#: templates/rest_framework/vertical/select_multiple.html:2
msgid "No items to select."
msgstr ""
#: validators.py:24
msgid "This field must be unique."
msgstr ""
#: validators.py:78
msgid "The fields {field_names} must make a unique set."
msgstr ""
#: validators.py:226
msgid "This field must be unique for the \"{date_field}\" date."
msgstr ""
#: validators.py:241
msgid "This field must be unique for the \"{date_field}\" month."
msgstr ""
#: validators.py:254
msgid "This field must be unique for the \"{date_field}\" year."
msgstr ""
#: versioning.py:42
msgid "Invalid version in \"Accept\" header."
msgstr ""
#: versioning.py:73 versioning.py:115
msgid "Invalid version in URL path."
msgstr ""
#: versioning.py:144
msgid "Invalid version in hostname."
msgstr ""
#: versioning.py:166
msgid "Invalid version in query parameter."
msgstr ""
#: views.py:86
msgid "Permission denied."
msgstr ""
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: Django REST framework\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-08-06 13:21+0100\n"
"PO-Revision-Date: 2015-08-06 12:21+0000\n"
"Last-Translator: Thomas Christie <tom@tomchristie.com>\n"
"Language-Team: French (Canada) (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/fr_CA/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: fr_CA\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
#: authentication.py:73
msgid "Invalid basic header. No credentials provided."
msgstr ""
#: authentication.py:76
msgid "Invalid basic header. Credentials string should not contain spaces."
msgstr ""
#: authentication.py:82
msgid "Invalid basic header. Credentials not correctly base64 encoded."
msgstr ""
#: authentication.py:100
msgid "Invalid username/password."
msgstr ""
#: authentication.py:103 authentication.py:191
msgid "User inactive or deleted."
msgstr ""
#: authentication.py:170
msgid "Invalid token header. No credentials provided."
msgstr ""
#: authentication.py:173
msgid "Invalid token header. Token string should not contain spaces."
msgstr ""
#: authentication.py:179
msgid ""
"Invalid token header. Token string should not contain invalid characters."
msgstr ""
#: authentication.py:188
msgid "Invalid token."
msgstr ""
#: authtoken/serializers.py:20
msgid "User account is disabled."
msgstr ""
#: authtoken/serializers.py:23
msgid "Unable to log in with provided credentials."
msgstr ""
#: authtoken/serializers.py:26
msgid "Must include \"username\" and \"password\"."
msgstr ""
#: exceptions.py:49
msgid "A server error occurred."
msgstr ""
#: exceptions.py:84
msgid "Malformed request."
msgstr ""
#: exceptions.py:89
msgid "Incorrect authentication credentials."
msgstr ""
#: exceptions.py:94
msgid "Authentication credentials were not provided."
msgstr ""
#: exceptions.py:99
msgid "You do not have permission to perform this action."
msgstr ""
#: exceptions.py:104 views.py:79
msgid "Not found."
msgstr ""
#: exceptions.py:109
msgid "Method \"{method}\" not allowed."
msgstr ""
#: exceptions.py:120
msgid "Could not satisfy the request Accept header."
msgstr ""
#: exceptions.py:132
msgid "Unsupported media type \"{media_type}\" in request."
msgstr ""
#: exceptions.py:145
msgid "Request was throttled."
msgstr ""
#: fields.py:167 relations.py:173 relations.py:206 validators.py:79
#: validators.py:162
msgid "This field is required."
msgstr ""
#: fields.py:168
msgid "This field may not be null."
msgstr ""
#: fields.py:504 fields.py:532
msgid "\"{input}\" is not a valid boolean."
msgstr ""
#: fields.py:567
msgid "This field may not be blank."
msgstr ""
#: fields.py:568 fields.py:1482
msgid "Ensure this field has no more than {max_length} characters."
msgstr ""
#: fields.py:569
msgid "Ensure this field has at least {min_length} characters."
msgstr ""
#: fields.py:606
msgid "Enter a valid email address."
msgstr ""
#: fields.py:617
msgid "This value does not match the required pattern."
msgstr ""
#: fields.py:628
msgid ""
"Enter a valid \"slug\" consisting of letters, numbers, underscores or "
"hyphens."
msgstr ""
#: fields.py:640
msgid "Enter a valid URL."
msgstr ""
#: fields.py:653
msgid "\"{value}\" is not a valid UUID."
msgstr ""
#: fields.py:687
msgid "Enter a valid IPv4 or IPv6 address."
msgstr ""
#: fields.py:712
msgid "A valid integer is required."
msgstr ""
#: fields.py:713 fields.py:748 fields.py:781
msgid "Ensure this value is less than or equal to {max_value}."
msgstr ""
#: fields.py:714 fields.py:749 fields.py:782
msgid "Ensure this value is greater than or equal to {min_value}."
msgstr ""
#: fields.py:715 fields.py:750 fields.py:786
msgid "String value too large."
msgstr ""
#: fields.py:747 fields.py:780
msgid "A valid number is required."
msgstr ""
#: fields.py:783
msgid "Ensure that there are no more than {max_digits} digits in total."
msgstr ""
#: fields.py:784
msgid ""
"Ensure that there are no more than {max_decimal_places} decimal places."
msgstr ""
#: fields.py:785
msgid ""
"Ensure that there are no more than {max_whole_digits} digits before the "
"decimal point."
msgstr ""
#: fields.py:899
msgid "Datetime has wrong format. Use one of these formats instead: {format}."
msgstr ""
#: fields.py:900
msgid "Expected a datetime but got a date."
msgstr ""
#: fields.py:965
msgid "Date has wrong format. Use one of these formats instead: {format}."
msgstr ""
#: fields.py:966
msgid "Expected a date but got a datetime."
msgstr ""
#: fields.py:1030
msgid "Time has wrong format. Use one of these formats instead: {format}."
msgstr ""
#: fields.py:1085
msgid "Duration has wrong format. Use one of these formats instead: {format}."
msgstr ""
#: fields.py:1110 fields.py:1154
msgid "\"{input}\" is not a valid choice."
msgstr ""
#: fields.py:1155 fields.py:1301 relations.py:405 serializers.py:504
msgid "Expected a list of items but got type \"{input_type}\"."
msgstr ""
#: fields.py:1156
msgid "This selection may not be empty."
msgstr ""
#: fields.py:1194
msgid "\"{input}\" is not a valid path choice."
msgstr ""
#: fields.py:1213
msgid "No file was submitted."
msgstr ""
#: fields.py:1214
msgid ""
"The submitted data was not a file. Check the encoding type on the form."
msgstr ""
#: fields.py:1215
msgid "No filename could be determined."
msgstr ""
#: fields.py:1216
msgid "The submitted file is empty."
msgstr ""
#: fields.py:1217
msgid ""
"Ensure this filename has at most {max_length} characters (it has {length})."
msgstr ""
#: fields.py:1263
msgid ""
"Upload a valid image. The file you uploaded was either not an image or a "
"corrupted image."
msgstr ""
#: fields.py:1302 relations.py:406 serializers.py:505
msgid "This list may not be empty."
msgstr ""
#: fields.py:1346
msgid "Expected a dictionary of items but got type \"{input_type}\"."
msgstr ""
#: pagination.py:192
msgid "Invalid page \"{page_number}\": {message}."
msgstr ""
#: pagination.py:459
msgid "Invalid cursor"
msgstr ""
#: relations.py:174
msgid "Invalid pk \"{pk_value}\" - object does not exist."
msgstr ""
#: relations.py:175
msgid "Incorrect type. Expected pk value, received {data_type}."
msgstr ""
#: relations.py:207
msgid "Invalid hyperlink - No URL match."
msgstr ""
#: relations.py:208
msgid "Invalid hyperlink - Incorrect URL match."
msgstr ""
#: relations.py:209
msgid "Invalid hyperlink - Object does not exist."
msgstr ""
#: relations.py:210
msgid "Incorrect type. Expected URL string, received {data_type}."
msgstr ""
#: relations.py:369
msgid "Object with {slug_name}={value} does not exist."
msgstr ""
#: relations.py:370
msgid "Invalid value."
msgstr ""
#: serializers.py:310
msgid "Invalid data. Expected a dictionary, but got {datatype}."
msgstr ""
#: templates/rest_framework/horizontal/radio.html:2
#: templates/rest_framework/inline/radio.html:2
#: templates/rest_framework/vertical/radio.html:2
msgid "None"
msgstr ""
#: templates/rest_framework/horizontal/select_multiple.html:2
#: templates/rest_framework/inline/select_multiple.html:2
#: templates/rest_framework/vertical/select_multiple.html:2
msgid "No items to select."
msgstr ""
#: validators.py:24
msgid "This field must be unique."
msgstr ""
#: validators.py:78
msgid "The fields {field_names} must make a unique set."
msgstr ""
#: validators.py:226
msgid "This field must be unique for the \"{date_field}\" date."
msgstr ""
#: validators.py:241
msgid "This field must be unique for the \"{date_field}\" month."
msgstr ""
#: validators.py:254
msgid "This field must be unique for the \"{date_field}\" year."
msgstr ""
#: versioning.py:42
msgid "Invalid version in \"Accept\" header."
msgstr ""
#: versioning.py:73 versioning.py:115
msgid "Invalid version in URL path."
msgstr ""
#: versioning.py:144
msgid "Invalid version in hostname."
msgstr ""
#: versioning.py:166
msgid "Invalid version in query parameter."
msgstr ""
#: views.py:86
msgid "Permission denied."
msgstr ""
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: Django REST framework\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-08-06 13:21+0100\n"
"PO-Revision-Date: 2015-08-06 12:21+0000\n"
"Last-Translator: Thomas Christie <tom@tomchristie.com>\n"
"Language-Team: Turkish (Turkey) (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/tr_TR/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: tr_TR\n"
"Plural-Forms: nplurals=1; plural=0;\n"
#: authentication.py:73
msgid "Invalid basic header. No credentials provided."
msgstr ""
#: authentication.py:76
msgid "Invalid basic header. Credentials string should not contain spaces."
msgstr ""
#: authentication.py:82
msgid "Invalid basic header. Credentials not correctly base64 encoded."
msgstr ""
#: authentication.py:100
msgid "Invalid username/password."
msgstr ""
#: authentication.py:103 authentication.py:191
msgid "User inactive or deleted."
msgstr ""
#: authentication.py:170
msgid "Invalid token header. No credentials provided."
msgstr ""
#: authentication.py:173
msgid "Invalid token header. Token string should not contain spaces."
msgstr ""
#: authentication.py:179
msgid ""
"Invalid token header. Token string should not contain invalid characters."
msgstr ""
#: authentication.py:188
msgid "Invalid token."
msgstr ""
#: authtoken/serializers.py:20
msgid "User account is disabled."
msgstr ""
#: authtoken/serializers.py:23
msgid "Unable to log in with provided credentials."
msgstr ""
#: authtoken/serializers.py:26
msgid "Must include \"username\" and \"password\"."
msgstr ""
#: exceptions.py:49
msgid "A server error occurred."
msgstr ""
#: exceptions.py:84
msgid "Malformed request."
msgstr ""
#: exceptions.py:89
msgid "Incorrect authentication credentials."
msgstr ""
#: exceptions.py:94
msgid "Authentication credentials were not provided."
msgstr ""
#: exceptions.py:99
msgid "You do not have permission to perform this action."
msgstr ""
#: exceptions.py:104 views.py:79
msgid "Not found."
msgstr ""
#: exceptions.py:109
msgid "Method \"{method}\" not allowed."
msgstr ""
#: exceptions.py:120
msgid "Could not satisfy the request Accept header."
msgstr ""
#: exceptions.py:132
msgid "Unsupported media type \"{media_type}\" in request."
msgstr ""
#: exceptions.py:145
msgid "Request was throttled."
msgstr ""
#: fields.py:167 relations.py:173 relations.py:206 validators.py:79
#: validators.py:162
msgid "This field is required."
msgstr ""
#: fields.py:168
msgid "This field may not be null."
msgstr ""
#: fields.py:504 fields.py:532
msgid "\"{input}\" is not a valid boolean."
msgstr ""
#: fields.py:567
msgid "This field may not be blank."
msgstr ""
#: fields.py:568 fields.py:1482
msgid "Ensure this field has no more than {max_length} characters."
msgstr ""
#: fields.py:569
msgid "Ensure this field has at least {min_length} characters."
msgstr ""
#: fields.py:606
msgid "Enter a valid email address."
msgstr ""
#: fields.py:617
msgid "This value does not match the required pattern."
msgstr ""
#: fields.py:628
msgid ""
"Enter a valid \"slug\" consisting of letters, numbers, underscores or "
"hyphens."
msgstr ""
#: fields.py:640
msgid "Enter a valid URL."
msgstr ""
#: fields.py:653
msgid "\"{value}\" is not a valid UUID."
msgstr ""
#: fields.py:687
msgid "Enter a valid IPv4 or IPv6 address."
msgstr ""
#: fields.py:712
msgid "A valid integer is required."
msgstr ""
#: fields.py:713 fields.py:748 fields.py:781
msgid "Ensure this value is less than or equal to {max_value}."
msgstr ""
#: fields.py:714 fields.py:749 fields.py:782
msgid "Ensure this value is greater than or equal to {min_value}."
msgstr ""
#: fields.py:715 fields.py:750 fields.py:786
msgid "String value too large."
msgstr ""
#: fields.py:747 fields.py:780
msgid "A valid number is required."
msgstr ""
#: fields.py:783
msgid "Ensure that there are no more than {max_digits} digits in total."
msgstr ""
#: fields.py:784
msgid ""
"Ensure that there are no more than {max_decimal_places} decimal places."
msgstr ""
#: fields.py:785
msgid ""
"Ensure that there are no more than {max_whole_digits} digits before the "
"decimal point."
msgstr ""
#: fields.py:899
msgid "Datetime has wrong format. Use one of these formats instead: {format}."
msgstr ""
#: fields.py:900
msgid "Expected a datetime but got a date."
msgstr ""
#: fields.py:965
msgid "Date has wrong format. Use one of these formats instead: {format}."
msgstr ""
#: fields.py:966
msgid "Expected a date but got a datetime."
msgstr ""
#: fields.py:1030
msgid "Time has wrong format. Use one of these formats instead: {format}."
msgstr ""
#: fields.py:1085
msgid "Duration has wrong format. Use one of these formats instead: {format}."
msgstr ""
#: fields.py:1110 fields.py:1154
msgid "\"{input}\" is not a valid choice."
msgstr ""
#: fields.py:1155 fields.py:1301 relations.py:405 serializers.py:504
msgid "Expected a list of items but got type \"{input_type}\"."
msgstr ""
#: fields.py:1156
msgid "This selection may not be empty."
msgstr ""
#: fields.py:1194
msgid "\"{input}\" is not a valid path choice."
msgstr ""
#: fields.py:1213
msgid "No file was submitted."
msgstr ""
#: fields.py:1214
msgid ""
"The submitted data was not a file. Check the encoding type on the form."
msgstr ""
#: fields.py:1215
msgid "No filename could be determined."
msgstr ""
#: fields.py:1216
msgid "The submitted file is empty."
msgstr ""
#: fields.py:1217
msgid ""
"Ensure this filename has at most {max_length} characters (it has {length})."
msgstr ""
#: fields.py:1263
msgid ""
"Upload a valid image. The file you uploaded was either not an image or a "
"corrupted image."
msgstr ""
#: fields.py:1302 relations.py:406 serializers.py:505
msgid "This list may not be empty."
msgstr ""
#: fields.py:1346
msgid "Expected a dictionary of items but got type \"{input_type}\"."
msgstr ""
#: pagination.py:192
msgid "Invalid page \"{page_number}\": {message}."
msgstr ""
#: pagination.py:459
msgid "Invalid cursor"
msgstr ""
#: relations.py:174
msgid "Invalid pk \"{pk_value}\" - object does not exist."
msgstr ""
#: relations.py:175
msgid "Incorrect type. Expected pk value, received {data_type}."
msgstr ""
#: relations.py:207
msgid "Invalid hyperlink - No URL match."
msgstr ""
#: relations.py:208
msgid "Invalid hyperlink - Incorrect URL match."
msgstr ""
#: relations.py:209
msgid "Invalid hyperlink - Object does not exist."
msgstr ""
#: relations.py:210
msgid "Incorrect type. Expected URL string, received {data_type}."
msgstr ""
#: relations.py:369
msgid "Object with {slug_name}={value} does not exist."
msgstr ""
#: relations.py:370
msgid "Invalid value."
msgstr ""
#: serializers.py:310
msgid "Invalid data. Expected a dictionary, but got {datatype}."
msgstr ""
#: templates/rest_framework/horizontal/radio.html:2
#: templates/rest_framework/inline/radio.html:2
#: templates/rest_framework/vertical/radio.html:2
msgid "None"
msgstr ""
#: templates/rest_framework/horizontal/select_multiple.html:2
#: templates/rest_framework/inline/select_multiple.html:2
#: templates/rest_framework/vertical/select_multiple.html:2
msgid "No items to select."
msgstr ""
#: validators.py:24
msgid "This field must be unique."
msgstr ""
#: validators.py:78
msgid "The fields {field_names} must make a unique set."
msgstr ""
#: validators.py:226
msgid "This field must be unique for the \"{date_field}\" date."
msgstr ""
#: validators.py:241
msgid "This field must be unique for the \"{date_field}\" month."
msgstr ""
#: validators.py:254
msgid "This field must be unique for the \"{date_field}\" year."
msgstr ""
#: versioning.py:42
msgid "Invalid version in \"Accept\" header."
msgstr ""
#: versioning.py:73 versioning.py:115
msgid "Invalid version in URL path."
msgstr ""
#: versioning.py:144
msgid "Invalid version in hostname."
msgstr ""
#: versioning.py:166
msgid "Invalid version in query parameter."
msgstr ""
#: views.py:86
msgid "Permission denied."
msgstr ""
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment