Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
D
django-rest-framework
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
edx
django-rest-framework
Commits
bb22ab8e
Commit
bb22ab8e
authored
Jun 08, 2016
by
Tom Christie
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
More robust form rendering in the browsable API (#4181)
parent
a5f822d0
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
82 additions
and
23 deletions
+82
-23
rest_framework/renderers.py
+29
-23
tests/browsable_api/test_form_rendering.py
+53
-0
No files found.
rest_framework/renderers.py
View file @
bb22ab8e
...
@@ -472,31 +472,37 @@ class BrowsableAPIRenderer(BaseRenderer):
...
@@ -472,31 +472,37 @@ class BrowsableAPIRenderer(BaseRenderer):
return
return
if
existing_serializer
is
not
None
:
if
existing_serializer
is
not
None
:
serializer
=
existing_serializer
try
:
return
self
.
render_form_for_serializer
(
existing_serializer
)
except
TypeError
:
pass
if
has_serializer
:
if
method
in
(
'PUT'
,
'PATCH'
):
serializer
=
view
.
get_serializer
(
instance
=
instance
,
**
kwargs
)
else
:
serializer
=
view
.
get_serializer
(
**
kwargs
)
else
:
else
:
if
has_serializer
:
# at this point we must have a serializer_class
if
method
in
(
'PUT'
,
'PATCH'
):
if
method
in
(
'PUT'
,
'PATCH'
):
serializer
=
view
.
get_serializer
(
instance
=
instance
,
**
kwargs
)
serializer
=
self
.
_get_serializer
(
view
.
serializer_class
,
view
,
else
:
request
,
instance
=
instance
,
**
kwargs
)
serializer
=
view
.
get_serializer
(
**
kwargs
)
else
:
else
:
# at this point we must have a serializer_class
serializer
=
self
.
_get_serializer
(
view
.
serializer_class
,
view
,
if
method
in
(
'PUT'
,
'PATCH'
):
request
,
**
kwargs
)
serializer
=
self
.
_get_serializer
(
view
.
serializer_class
,
view
,
request
,
instance
=
instance
,
**
kwargs
)
return
self
.
render_form_for_serializer
(
serializer
)
else
:
serializer
=
self
.
_get_serializer
(
view
.
serializer_class
,
view
,
def
render_form_for_serializer
(
self
,
serializer
):
request
,
**
kwargs
)
if
hasattr
(
serializer
,
'initial_data'
):
serializer
.
is_valid
()
if
hasattr
(
serializer
,
'initial_data'
):
serializer
.
is_valid
()
form_renderer
=
self
.
form_renderer_class
()
return
form_renderer
.
render
(
form_renderer
=
self
.
form_renderer_class
()
serializer
.
data
,
return
form_renderer
.
render
(
self
.
accepted_media_type
,
serializer
.
data
,
{
'style'
:
{
'template_pack'
:
'rest_framework/horizontal'
}}
self
.
accepted_media_type
,
)
{
'style'
:
{
'template_pack'
:
'rest_framework/horizontal'
}}
)
def
get_raw_data_form
(
self
,
data
,
view
,
method
,
request
):
def
get_raw_data_form
(
self
,
data
,
view
,
method
,
request
):
"""
"""
...
...
tests/browsable_api/test_form_rendering.py
0 → 100644
View file @
bb22ab8e
from
django.test
import
TestCase
from
rest_framework
import
generics
,
renderers
,
serializers
,
status
from
rest_framework.response
import
Response
from
rest_framework.test
import
APIRequestFactory
from
tests.models
import
BasicModel
factory
=
APIRequestFactory
()
class
BasicSerializer
(
serializers
.
ModelSerializer
):
class
Meta
:
model
=
BasicModel
class
ManyPostView
(
generics
.
GenericAPIView
):
queryset
=
BasicModel
.
objects
.
all
()
serializer_class
=
BasicSerializer
renderer_classes
=
(
renderers
.
BrowsableAPIRenderer
,
renderers
.
JSONRenderer
)
def
post
(
self
,
request
,
*
args
,
**
kwargs
):
serializer
=
self
.
get_serializer
(
self
.
get_queryset
(),
many
=
True
)
return
Response
(
serializer
.
data
,
status
.
HTTP_200_OK
)
class
TestManyPostView
(
TestCase
):
def
setUp
(
self
):
"""
Create 3 BasicModel instances.
"""
items
=
[
'foo'
,
'bar'
,
'baz'
]
for
item
in
items
:
BasicModel
(
text
=
item
)
.
save
()
self
.
objects
=
BasicModel
.
objects
self
.
data
=
[
{
'id'
:
obj
.
id
,
'text'
:
obj
.
text
}
for
obj
in
self
.
objects
.
all
()
]
self
.
view
=
ManyPostView
.
as_view
()
def
test_post_many_post_view
(
self
):
"""
POST request to a view that returns a list of objects should
still successfully return the browsable API with a rendered form.
Regression test for https://github.com/tomchristie/django-rest-framework/pull/3164
"""
data
=
{}
request
=
factory
.
post
(
'/'
,
data
,
format
=
'json'
)
with
self
.
assertNumQueries
(
1
):
response
=
self
.
view
(
request
)
.
render
()
self
.
assertEqual
(
response
.
status_code
,
status
.
HTTP_200_OK
)
self
.
assertEqual
(
len
(
response
.
data
),
3
)
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment