From 760da25c6018eff02b3aab33dc6fea7c93881d9f Mon Sep 17 00:00:00 2001
From: Tom Christie
Date: Wed, 17 Dec 2014 16:23:42 +0000
Subject: [PATCH] Update documentation
---
.DS_Store | Bin 0 -> 6148 bytes
api-guide/fields/index.html | 1 +
api-guide/pagination/index.html | 2 +-
api-guide/permissions/index.html | 13 +++++++++++--
api-guide/relations/index.html | 2 +-
api-guide/routers/index.html | 2 +-
api-guide/serializers/index.html | 7 +++++++
img/.DS_Store | Bin 0 -> 15364 bytes
img/1-kuwaitnet.png | Bin 0 -> 12302 bytes
img/autocomplete.png | Bin 0 -> 58140 bytes
img/sponsors/.DS_Store | Bin 0 -> 6148 bytes
tutorial/1-serialization/index.html | 4 ++--
tutorial/2-requests-and-responses/index.html | 2 +-
tutorial/quickstart/index.html | 2 +-
14 files changed, 26 insertions(+), 9 deletions(-)
create mode 100644 .DS_Store
create mode 100644 img/.DS_Store
create mode 100644 img/1-kuwaitnet.png
create mode 100644 img/autocomplete.png
create mode 100644 img/sponsors/.DS_Store
diff --git a/.DS_Store b/.DS_Store
new file mode 100644
index 0000000000000000000000000000000000000000..e1d77174bc6377a44550174d5d207307874cfa00
GIT binary patch
literal 6148
zcmeHK%Wl&^6rJ0o;PgRF-#i4S*&sDS=_8a%2uvt~ibbO)qN$ovoY+k*9FJ=|2_*!=
zjz8c7*t6pU_yLw|S+HZphCO#Ylk^c-ltqOqUuouC-^Yya@nj}L2!V7}pCLphgh<#J
zM*Fb)gD^j9UD6{gy@`h=yXMghLC}ff&YyG_S=mRlT=8#SU>ptwM@@X
zCci>YB-(rCtQ3n$1BEry)@eOWtG4cKWOryiYwAW(b2kIs*ZiuN*4)68(fl3s1bU8A
z3-yACUNd!nXG@-FG*Zd=gp!(XCX~j)>_S4hIWyO6#v~~w6KQPf#_dNrt?{b)`VA)y
zaE}ROP+%M0q9STAOEs|v!H=TDYxpM1ohthJ2L{g#$>)bhM#sh{CNEsPbb0v7Rb@*a
zDQczXWtWw9pIX#STUBFA9`dlrhdYx+>lT12l
zyiIhsBFWG(#&Wh+G2&`QjHEsmc@mi>_eho$$S!G-_v8clL_U)*-$h8N2=sB9KRQQO8v)A4KqRpLIzGb18jd#urX8x
zwm1e`2X?^~05OW@Ku~9Q36`S>R0Xy;q6Yam4_hj&?=FsRCOZc{%}c`2aC9
zh#Lw7v*Y+m5Kchl81^9pAp?gQi10_5o&OL1e*Zt56h4IvgbbW21|YhWT}op~;%x0I
zj-9m%wrALwu(%e-AO$;d90v+JiYKuJfQh^oLAN3@`Xe*^*=!Y*XsL>c%Ejzs|2
literal 0
HcmV?d00001
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:
+
+- The request was successfully authenticated, but permission was denied. — An HTTP 403 Forbidden response will be returned.
+- The request was not successfully authenticated, and the highest priority authentication class does not use
WWW-Authenticate
headers. — An HTTP 403 Forbidden response will be returned.
+- The request was not successfully authenticated, and the highest priority authentication class does use
WWW-Authenticate
headers. — An HTTP 401 Unauthorized response, with an appropriate WWW-Authenticate
header will be returned.
+
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 0000000000000000000000000000000000000000..ad96cb498be3afce5fd939b21547ee9bd29f67b3
GIT binary patch
literal 15364
zcmeHMS!~=y82P;YBfCm~G}+OX|P5NJ{*MQ!P!cDqfJrW}o$v`J`6>b0H3tz&O(
z?}icrDIio3AT9|cgt&PC1TUNqNE{Coal8;AKpYRi3lC6b~gwKA)zu8
zdH(UteE-aR^UbVh0sxrG8XW*}0FdZmR+TBL5Lh{T%0g9?Q%4pF58%NuSOXbwV63dR
z$Pf$&1_T3w0l|P^;J?5C{bsWuEe@@S1p|Ts!9allwm-z_VKy1rnb7jBgCc$eAX`n@
zJW!g>0UQ&LY%;Plq2*BW8J-?6f?{;Uzz|O5aaNsdGO{zF4dH+x958AbqZ119)(IEq
z)d7>C6|rDIFi_3_JG(Cejn3>A#YN}$9^2K^wwtDMwxqh~Y59W(O0hf*vJij^Iz1DF
zx51=$Gk^Xs!GBPKmkDQ5ds&Xt=*A$rH<*jVy(PE?FyJt?&2AW6Xd@3M_|$G2#gmjj
zMt{t2WpAIBcv}pkgvrs^*(g{acxrAR_}CvR8hbOfVbe`V2F43WpL#G(zHIVnQ!eWt
z%bVnN{+gF!-^>2C@5&=&d=>kX$e&03G5&&);`-;oQJNFR!V%6Z(?n1i%XmSlh?j<<
z*%+m?M!GPG0hiK8hzo;KI(e3-L>DLow39hg|_t?~68mrYN{Bq^qXRKIG?mR7eix$huc}vuq+Pd@Wmo_YGY`S21ZS#fk5w$L@=|{#q
z#=s8OcDalFP0uG=
zh95j=YiZNo
z#s#S0Qe1_ru@%?hR!m|K?!^OWpowFc!K0YNNG4TznXHWbMg~t%qD%?4pX&`pU-f)m
z37=zL^jrr!ySf{8$@3CBcj`yf8eOyXtgQv+cH3rD`UARaXD1xLY#N4&giI=F!aCN<%0Mm@rg}w`
zxxQXj26cC0f;#6%d7CyX%C)T7D>XmZlQA9Y(n)H2TXK7y(xi0GH$+JqVyNwgVH%0#
zt-td5Kcn2dDiX=|Fc~9Ntbn!934?Hmw%#eY3m$^U;U#zlUWM1-9on*I;dA&FeuPu-
z6P$+MunL!84c1~EF2@$U1TV$Q@N(RQn{f;7#NBu$UWHfV03O5yukQgGe_04Y%^ccOtK`Mn%9-C
zkG!bVg=}?5yfz74Q6;WD2EMq3UaM$zgr%)*imWc+Yk-w9d8_AewX@gt8)R9n=IepI
zZr(zr=W^LEZ@QpSZkAIq`nBWDEN)R`iMH5(uGsfUuiubbPs8u<2QEYz8)@%s!8N4O
zB&JBAUD%Diw1f8JKHN_l)llbqsY83Ihdya_nv{ARZ^m2jPP`lM!F%yOd>9|WNAWRy
z9G}JK@OgZJl=~XKj&I}pIE!DFX!eQ{&3;u$v$;Ocv0aD#8;$MTHS__)KB(BID*LQt
zpSb9bfGkO(4Fd!HZ4CEPD5GLa6{(mPO>F4?Xf4;h~f&sz6S;zoZ
zclLFrXkhshV(A#!U3;9KL-eq~>dl0fLnvZZSU$gwrx$h|&(Fk^7o8_~c`~Xu6Iu=@
z9EXz)Z}b24e+G#2Kchbk;{5-=JpbpXUs%C_U_dY+7!V8y1_T3w0l|P^KrkQ}5DW+g
P1OtKr!GK`k>|@|h3DNFE
literal 0
HcmV?d00001
diff --git a/img/1-kuwaitnet.png b/img/1-kuwaitnet.png
new file mode 100644
index 0000000000000000000000000000000000000000..c73b68154dd3768118d5f623f21a4231f78d0da3
GIT binary patch
literal 12302
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