Merge pull request #256 from markotibold/put-post-delete

Re-enable PUT/POST/DELETE in the browsable api
This commit is contained in:
Tom Christie 2012-09-08 14:10:29 -07:00
commit a33c21764a
3 changed files with 27 additions and 31 deletions

View File

@ -22,7 +22,7 @@ class CreateModelMixin(object):
self.object = serializer.object self.object = serializer.object
self.object.save() self.object.save()
return Response(serializer.data, status=status.HTTP_201_CREATED) return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.error_data, status=status.HTTP_400_BAD_REQUEST) return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
class ListModelMixin(object): class ListModelMixin(object):

View File

@ -16,6 +16,7 @@ from djangorestframework.utils import encoders
from djangorestframework.utils.breadcrumbs import get_breadcrumbs from djangorestframework.utils.breadcrumbs import get_breadcrumbs
from djangorestframework.utils.mediatypes import get_media_type_params, add_media_type_param, media_type_matches from djangorestframework.utils.mediatypes import get_media_type_params, add_media_type_param, media_type_matches
from djangorestframework import VERSION from djangorestframework import VERSION
from djangorestframework.fields import FloatField, IntegerField, DateTimeField, DateField, EmailField, CharField, BooleanField
import string import string
@ -233,33 +234,31 @@ class DocumentingTemplateRenderer(BaseRenderer):
In the absence on of the Resource having an associated form then In the absence on of the Resource having an associated form then
provide a form that can be used to submit arbitrary content. provide a form that can be used to submit arbitrary content.
""" """
if not hasattr(self.view, 'get_serializer'): # No serializer, no form.
return
# We need to map our Fields to Django's Fields.
field_mapping = dict([
[FloatField.__name__, forms.FloatField],
[IntegerField.__name__, forms.IntegerField],
[DateTimeField.__name__, forms.DateTimeField],
[DateField.__name__, forms.DateField],
[EmailField.__name__, forms.EmailField],
[CharField.__name__, forms.CharField],
[BooleanField.__name__, forms.BooleanField]
])
# Get the form instance if we have one bound to the input # Creating an on the fly form see: http://stackoverflow.com/questions/3915024/dynamically-creating-classes-python
form_instance = None fields = {}
if method == getattr(view, 'method', view.request.method).lower(): object, data = None, None
form_instance = getattr(view, 'bound_form_instance', None) if hasattr(self.view, 'object'):
object = self.view.object
if not form_instance and hasattr(view, 'get_bound_form'): serializer = self.view.get_serializer(instance=object)
# Otherwise if we have a response that is valid against the form then use that for k, v in serializer.fields.items():
if view.response.has_content_body: fields[k] = field_mapping[v.__class__.__name__]()
try: OnTheFlyForm = type("OnTheFlyForm", (forms.Form,), fields)
form_instance = view.get_bound_form(view.response.cleaned_content, method=method) if object and not self.view.request.method == 'DELETE': # Don't fill in the form when the object is deleted
if form_instance and not form_instance.is_valid(): data = serializer.data
form_instance = None form_instance = OnTheFlyForm(data)
except Exception:
form_instance = None
# If we still don't have a form instance then try to get an unbound form
if not form_instance:
try:
form_instance = view.get_bound_form(method=method)
except Exception:
pass
# If we still don't have a form instance then try to get an unbound form which can tunnel arbitrary content types
if not form_instance:
form_instance = self._get_generic_content_form(view)
return form_instance return form_instance
def _get_generic_content_form(self, view): def _get_generic_content_form(self, view):

View File

@ -78,8 +78,6 @@
</form> </form>
{% endif %} {% endif %}
{% comment %}
DROP POST/PUT/DELETE until the forms are working with REST framework 2
{# Only display the POST/PUT/DELETE forms if method tunneling via POST forms is enabled and the user has permissions on this view. #} {# Only display the POST/PUT/DELETE forms if method tunneling via POST forms is enabled and the user has permissions on this view. #}
{% if response.status_code != 403 %} {% if response.status_code != 403 %}
@ -141,7 +139,6 @@
{% endif %} {% endif %}
{% endif %} {% endif %}
{% endcomment %}
</div> </div>
<!-- END content-main --> <!-- END content-main -->