diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 000000000..e1d77174b Binary files /dev/null and b/.DS_Store differ diff --git a/api-guide/fields/index.html b/api-guide/fields/index.html index eb3fc6f32..c25754161 100644 --- a/api-guide/fields/index.html +++ b/api-guide/fields/index.html @@ -628,6 +628,7 @@ color_channel = serializers.ChoiceField(

Boolean fields

BooleanField

A boolean representation.

+

When using HTML encoded form input be aware that omitting a value will always be treated as setting a field to False, even if it has a default=True option specified. This is because HTML checkbox inputs represent the unchecked state by omitting the value, so REST framework treats omission as if it is an empty checkbox input.

Corresponds to django.db.models.fields.BooleanField.

Signature: BooleanField()

NullBooleanField

diff --git a/api-guide/pagination/index.html b/api-guide/pagination/index.html index 3d8613587..870035c24 100644 --- a/api-guide/pagination/index.html +++ b/api-guide/pagination/index.html @@ -513,7 +513,7 @@ class LinksSerializer(serializers.Serializer): class CustomPaginationSerializer(pagination.BasePaginationSerializer): links = LinksSerializer(source='*') # Takes the page object as the source - total_results = serializers.Field(source='paginator.count') + total_results = serializers.ReadOnlyField(source='paginator.count') results_field = 'objects' diff --git a/api-guide/permissions/index.html b/api-guide/permissions/index.html index a8a8ecd3e..893d3957b 100644 --- a/api-guide/permissions/index.html +++ b/api-guide/permissions/index.html @@ -459,10 +459,19 @@

Together with authentication and throttling, permissions determine whether a request should be granted or denied access.

Permission checks are always run at the very start of the view, before any other code is allowed to proceed. Permission checks will typically use the authentication information in the request.user and request.auth properties to determine if the incoming request should be permitted.

+

Permissions are used to grant or deny access different classes of users to different parts of the API.

+

The simplest style of permission would be to allow access to any authenticated user, and deny access to any unauthenticated user. This corresponds the IsAuthenticated class in REST framework.

+

A slightly less strict style of permission would be to allow full access to authenticated users, but allow read-only access to unauthenticated users. This corresponds to the IsAuthenticatedOrReadOnly class in REST framework.

How permissions are determined

Permissions in REST framework are always defined as a list of permission classes.

Before running the main body of the view each permission in the list is checked. -If any permission check fails an exceptions.PermissionDenied exception will be raised, and the main body of the view will not run.

+If any permission check fails an exceptions.PermissionDenied or exceptions.NotAuthenticated exception will be raised, and the main body of the view will not run.

+

When the permissions checks fail either a "403 Forbidden" or a "401 Unauthorized" response will be returned, according to the following rules:

+

Object level permissions

REST framework permissions also support object-level permissioning. Object level permissions are used to determine if a user should be allowed to act on a particular object, which will typically be a model instance.

Object level permissions are run by REST framework's generic views when .get_object() is called. @@ -526,7 +535,7 @@ def example_view(request, format=None):

This permission is suitable if you want your API to only be accessible to registered users.

IsAdminUser

The IsAdminUser permission class will deny permission to any user, unless user.is_staff is True in which case permission will be allowed.

-

This permission is suitable is you want your API to only be accessible to a subset of trusted administrators.

+

This permission is suitable if you want your API to only be accessible to a subset of trusted administrators.

IsAuthenticatedOrReadOnly

The IsAuthenticatedOrReadOnly will allow authenticated users to perform any request. Requests for unauthorised users will only be permitted if the request method is one of the "safe" methods; GET, HEAD or OPTIONS.

This permission is suitable if you want to your API to allow read permissions to anonymous users, and only allow write permissions to authenticated users.

diff --git a/api-guide/relations/index.html b/api-guide/relations/index.html index 03e88565a..2c4fe9b65 100644 --- a/api-guide/relations/index.html +++ b/api-guide/relations/index.html @@ -792,7 +792,7 @@ class Note(models.Model): return 'Note: ' + value.text raise Exception('Unexpected type of tagged object') -

If you need the target of the relationship to have a nested representation, you can use the required serializers inside the .to_native() method:

+

If you need the target of the relationship to have a nested representation, you can use the required serializers inside the .to_representation() method:

    def to_representation(self, value):
         """
         Serialize bookmark instances using a bookmark serializer,
diff --git a/api-guide/routers/index.html b/api-guide/routers/index.html
index 892e9df46..e204b48ed 100644
--- a/api-guide/routers/index.html
+++ b/api-guide/routers/index.html
@@ -462,7 +462,7 @@ urlpatterns = router.urls
 
 

Note: The base_name argument is used to specify the initial part of the view name pattern. In the example above, that's the user or account part.

-

Typically you won't need to specify the base-name argument, but if you have a viewset where you've defined a custom get_queryset method, then the viewset may not have a .queryset attribute set. If you try to register that viewset you'll see an error like this:

+

Typically you won't need to specify the base_name argument, but if you have a viewset where you've defined a custom get_queryset method, then the viewset may not have a .queryset attribute set. If you try to register that viewset you'll see an error like this:

'base_name' argument not specified, and could not automatically determine the name from the viewset, as it does not have a '.queryset' attribute.
 

This means you'll need to explicitly set the base_name argument when registering the viewset, as it could not be automatically determined from the model name.

diff --git a/api-guide/serializers/index.html b/api-guide/serializers/index.html index 71da4a993..548888968 100644 --- a/api-guide/serializers/index.html +++ b/api-guide/serializers/index.html @@ -369,6 +369,10 @@ Validation +
  • + Accessing the initial data and instance +
  • +
  • Partial updates
  • @@ -736,6 +740,9 @@ class GameRecord(serializers.Serializer): )

    For more information see the validators documentation.

    +

    Accessing the initial data and instance

    +

    When passing an initial object or queryset to a serializer instance, the object will be made available as .instance. If no initial object is passed then the .instance attribute will be None.

    +

    When passing data to a serializer instance, the unmodified data will be made available as .initial_data. If the data keyword argument is not passed then the .initial_data attribute will not exist.

    Partial updates

    By default, serializers must be passed values for all required fields or they will raise validation errors. You can use the partial argument in order to allow partial updates.

    # Update `comment` with partial data
    diff --git a/img/.DS_Store b/img/.DS_Store
    new file mode 100644
    index 000000000..ad96cb498
    Binary files /dev/null and b/img/.DS_Store differ
    diff --git a/img/1-kuwaitnet.png b/img/1-kuwaitnet.png
    new file mode 100644
    index 000000000..c73b68154
    Binary files /dev/null and b/img/1-kuwaitnet.png differ
    diff --git a/img/autocomplete.png b/img/autocomplete.png
    new file mode 100644
    index 000000000..29075b257
    Binary files /dev/null and b/img/autocomplete.png differ
    diff --git a/img/sponsors/.DS_Store b/img/sponsors/.DS_Store
    new file mode 100644
    index 000000000..24ff55088
    Binary files /dev/null and b/img/sponsors/.DS_Store differ
    diff --git a/tutorial/1-serialization/index.html b/tutorial/1-serialization/index.html
    index 435d47e6c..5682989c4 100644
    --- a/tutorial/1-serialization/index.html
    +++ b/tutorial/1-serialization/index.html
    @@ -535,7 +535,7 @@ content
     

    Deserialization is similar. First we parse a stream into Python native datatypes...

    # This import will use either `StringIO.StringIO` or `io.BytesIO`
     # as appropriate, depending on if we're running Python 2 or Python 3.
    -from rest_framework.compat import BytesIO
    +from django.utils.six import BytesIO
     
     stream = BytesIO(content)
     data = JSONParser().parse(stream)
    @@ -565,7 +565,7 @@ Open the file snippets/serializers.py again, and edit the Sni
             model = Snippet
             fields = ('id', 'title', 'code', 'linenos', 'language', 'style')
     
    -

    One nice property that serializers have is that you can inspect all the fields in a serializer instance, by printing it's representation. Open the Django shell with python manange.py shell, then try the following:

    +

    One nice property that serializers have is that you can inspect all the fields in a serializer instance, by printing it's representation. Open the Django shell with python manage.py shell, then try the following:

    >>> from snippets.serializers import SnippetSerializer
     >>> serializer = SnippetSerializer()
     >>> print(repr(serializer))
    diff --git a/tutorial/2-requests-and-responses/index.html b/tutorial/2-requests-and-responses/index.html
    index 9fa4b0920..e9436d2aa 100644
    --- a/tutorial/2-requests-and-responses/index.html
    +++ b/tutorial/2-requests-and-responses/index.html
    @@ -547,7 +547,7 @@ http --json POST http://127.0.0.1:8000/snippets/ code="print 456"
         "id": 4,
         "title": "",
         "code": "print 456",
    -    "linenos": true,
    +    "linenos": false,
         "language": "python",
         "style": "friendly"
     }
    diff --git a/tutorial/quickstart/index.html b/tutorial/quickstart/index.html
    index 64243dc00..b81e1dc4a 100644
    --- a/tutorial/quickstart/index.html
    +++ b/tutorial/quickstart/index.html
    @@ -403,7 +403,7 @@ pip install django
     pip install djangorestframework
     
     # Set up a new project with a single application
    -django-admin.py startproject tutorial .
    +django-admin.py startproject tutorial .  # Note the trailing '.' character
     cd tutorial
     django-admin.py startapp quickstart
     cd ..