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
b7d11cbc
Commit
b7d11cbc
authored
Oct 22, 2012
by
Tom Christie
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #312 from markotibold/BrowsableAPIRenderer
WIP on #310
parents
aba0172f
d1e05ea8
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
30 additions
and
24 deletions
+30
-24
rest_framework/renderers.py
+30
-24
No files found.
rest_framework/renderers.py
View file @
b7d11cbc
...
...
@@ -224,11 +224,9 @@ class BrowsableAPIRenderer(BaseRenderer):
return
content
def
get_form
(
self
,
view
,
method
,
request
):
def
show_form_for_method
(
self
,
view
,
method
,
request
):
"""
Get a form, possibly bound to either the input or output data.
In the absence on of the Resource having an associated form then
provide a form that can be used to submit arbitrary content.
Returns True if a form should be shown for this method.
"""
if
not
method
in
view
.
allowed_methods
:
return
# Not a valid method
...
...
@@ -242,20 +240,9 @@ class BrowsableAPIRenderer(BaseRenderer):
return
# Don't have permission
except
:
return
# Don't have permission and exception explicitly raise
return
True
if
method
==
'DELETE'
or
method
==
'OPTIONS'
:
return
True
# Don't actually need to return a form
if
(
not
getattr
(
view
,
'get_serializer'
,
None
)
or
not
parsers
.
FormParser
in
getattr
(
view
,
'parser_classes'
)):
media_types
=
[
parser
.
media_type
for
parser
in
view
.
parser_classes
]
return
self
.
get_generic_content_form
(
media_types
)
#####
# TODO: This is a little bit of a hack. Actually we'd like to remove
# this and just render serializer fields to html directly.
# We need to map our Fields to Django's Fields.
def
serializer_to_form_fields
(
self
,
serializer
):
field_mapping
=
{
serializers
.
FloatField
:
forms
.
FloatField
,
serializers
.
IntegerField
:
forms
.
IntegerField
,
...
...
@@ -268,13 +255,7 @@ class BrowsableAPIRenderer(BaseRenderer):
serializers
.
ManyPrimaryKeyRelatedField
:
forms
.
ModelMultipleChoiceField
}
# Creating an on the fly form see: http://stackoverflow.com/questions/3915024/dynamically-creating-classes-python
fields
=
{}
obj
,
data
=
None
,
None
if
getattr
(
view
,
'object'
,
None
):
obj
=
view
.
object
serializer
=
view
.
get_serializer
(
instance
=
obj
)
for
k
,
v
in
serializer
.
get_fields
(
True
)
.
items
():
if
getattr
(
v
,
'readonly'
,
True
):
continue
...
...
@@ -306,9 +287,34 @@ class BrowsableAPIRenderer(BaseRenderer):
fields
[
k
]
=
field_mapping
[
v
.
__class__
](
**
kwargs
)
except
KeyError
:
fields
[
k
]
=
forms
.
CharField
(
**
kwargs
)
return
fields
def
get_form
(
self
,
view
,
method
,
request
):
"""
Get a form, possibly bound to either the input or output data.
In the absence on of the Resource having an associated form then
provide a form that can be used to submit arbitrary content.
"""
if
not
self
.
show_form_for_method
(
view
,
method
,
request
):
return
if
method
==
'DELETE'
or
method
==
'OPTIONS'
:
return
True
# Don't actually need to return a form
if
not
getattr
(
view
,
'get_serializer'
,
None
)
or
not
parsers
.
FormParser
in
view
.
parser_classes
:
media_types
=
[
parser
.
media_type
for
parser
in
view
.
parser_classes
]
return
self
.
get_generic_content_form
(
media_types
)
# Creating an on the fly form see: http://stackoverflow.com/questions/3915024/dynamically-creating-classes-python
obj
,
data
=
None
,
None
if
getattr
(
view
,
'object'
,
None
):
obj
=
view
.
object
serializer
=
view
.
get_serializer
(
instance
=
obj
)
fields
=
self
.
serializer_to_form_fields
(
serializer
)
OnTheFlyForm
=
type
(
"OnTheFlyForm"
,
(
forms
.
Form
,),
fields
)
if
obj
and
not
view
.
request
.
method
==
'DELETE'
:
# Don't fill in the form when the object is deleted
if
obj
:
data
=
serializer
.
data
form_instance
=
OnTheFlyForm
(
data
)
return
form_instance
...
...
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