mirror of
				https://github.com/encode/django-rest-framework.git
				synced 2025-11-04 18:08:03 +03:00 
			
		
		
		
	Merge pull request #256 from markotibold/put-post-delete
Re-enable PUT/POST/DELETE in the browsable api
This commit is contained in:
		
						commit
						a33c21764a
					
				| 
						 | 
					@ -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):
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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):
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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 -->
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue
	
	Block a user