mirror of
https://github.com/encode/django-rest-framework.git
synced 2025-05-07 01:13:44 +03:00
Merge 60cd5363ab
into 8bafa01abd
This commit is contained in:
commit
dc9960f770
|
@ -491,17 +491,17 @@ class ReadModelMixin(object):
|
||||||
try:
|
try:
|
||||||
if args:
|
if args:
|
||||||
# If we have any none kwargs then assume the last represents the primrary key
|
# If we have any none kwargs then assume the last represents the primrary key
|
||||||
instance = model.objects.get(pk=args[-1], **kwargs)
|
self.model_instance = model.objects.get(pk=args[-1], **kwargs)
|
||||||
else:
|
else:
|
||||||
# Otherwise assume the kwargs uniquely identify the model
|
# Otherwise assume the kwargs uniquely identify the model
|
||||||
filtered_keywords = kwargs.copy()
|
filtered_keywords = kwargs.copy()
|
||||||
if BaseRenderer._FORMAT_QUERY_PARAM in filtered_keywords:
|
if BaseRenderer._FORMAT_QUERY_PARAM in filtered_keywords:
|
||||||
del filtered_keywords[BaseRenderer._FORMAT_QUERY_PARAM]
|
del filtered_keywords[BaseRenderer._FORMAT_QUERY_PARAM]
|
||||||
instance = model.objects.get(**filtered_keywords)
|
self.model_instance = model.objects.get(**filtered_keywords)
|
||||||
except model.DoesNotExist:
|
except model.DoesNotExist:
|
||||||
raise ErrorResponse(status.HTTP_404_NOT_FOUND)
|
raise ErrorResponse(status.HTTP_404_NOT_FOUND)
|
||||||
|
|
||||||
return instance
|
return self.model_instance
|
||||||
|
|
||||||
|
|
||||||
class CreateModelMixin(object):
|
class CreateModelMixin(object):
|
||||||
|
@ -540,19 +540,19 @@ class UpdateModelMixin(object):
|
||||||
try:
|
try:
|
||||||
if args:
|
if args:
|
||||||
# If we have any none kwargs then assume the last represents the primrary key
|
# If we have any none kwargs then assume the last represents the primrary key
|
||||||
instance = model.objects.get(pk=args[-1], **kwargs)
|
self.model_instance = model.objects.get(pk=args[-1], **kwargs)
|
||||||
else:
|
else:
|
||||||
# Otherwise assume the kwargs uniquely identify the model
|
# Otherwise assume the kwargs uniquely identify the model
|
||||||
instance = model.objects.get(**kwargs)
|
self.model_instance = model.objects.get(**kwargs)
|
||||||
|
|
||||||
for (key, val) in self.CONTENT.items():
|
for (key, val) in self.CONTENT.items():
|
||||||
setattr(instance, key, val)
|
setattr(self.model_instance, key, val)
|
||||||
except model.DoesNotExist:
|
except model.DoesNotExist:
|
||||||
instance = model(**self.CONTENT)
|
self.model_instance = model(**self.CONTENT)
|
||||||
instance.save()
|
self.model_instance.save()
|
||||||
|
|
||||||
instance.save()
|
self.model_instance.save()
|
||||||
return instance
|
return self.model_instance
|
||||||
|
|
||||||
|
|
||||||
class DeleteModelMixin(object):
|
class DeleteModelMixin(object):
|
||||||
|
|
|
@ -179,12 +179,10 @@ class FormResource(Resource):
|
||||||
raise ErrorResponse(400, detail)
|
raise ErrorResponse(400, detail)
|
||||||
|
|
||||||
|
|
||||||
def get_bound_form(self, data=None, files=None, method=None):
|
def get_form_class(self, method=None):
|
||||||
"""
|
"""
|
||||||
Given some content return a Django form bound to that content.
|
Returns the form class used to validate this resource.
|
||||||
If form validation is turned off (:attr:`form` class attribute is :const:`None`) then returns :const:`None`.
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
# A form on the view overrides a form on the resource.
|
# A form on the view overrides a form on the resource.
|
||||||
form = getattr(self.view, 'form', None) or self.form
|
form = getattr(self.view, 'form', None) or self.form
|
||||||
|
|
||||||
|
@ -200,6 +198,16 @@ class FormResource(Resource):
|
||||||
form = getattr(self, '%s_form' % method.lower(), form)
|
form = getattr(self, '%s_form' % method.lower(), form)
|
||||||
form = getattr(self.view, '%s_form' % method.lower(), form)
|
form = getattr(self.view, '%s_form' % method.lower(), form)
|
||||||
|
|
||||||
|
return form
|
||||||
|
|
||||||
|
|
||||||
|
def get_bound_form(self, data=None, files=None, method=None):
|
||||||
|
"""
|
||||||
|
Given some content return a Django form bound to that content.
|
||||||
|
If form validation is turned off (:attr:`form` class attribute is :const:`None`) then returns :const:`None`.
|
||||||
|
"""
|
||||||
|
form = self.get_form_class(method)
|
||||||
|
|
||||||
if not form:
|
if not form:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
@ -306,31 +314,31 @@ class ModelResource(FormResource):
|
||||||
If the :attr:`form` class attribute has been explicitly set then that class will be used
|
If the :attr:`form` class attribute has been explicitly set then that class will be used
|
||||||
to create the Form, otherwise the model will be used to create a ModelForm.
|
to create the Form, otherwise the model will be used to create a ModelForm.
|
||||||
"""
|
"""
|
||||||
|
form = self.get_form_class(method)
|
||||||
|
|
||||||
form = super(ModelResource, self).get_bound_form(data, files, method=method)
|
if not form and self.model:
|
||||||
|
|
||||||
# Use an explict Form if it exists
|
|
||||||
if form:
|
|
||||||
return form
|
|
||||||
|
|
||||||
elif self.model:
|
|
||||||
# Fall back to ModelForm which we create on the fly
|
# Fall back to ModelForm which we create on the fly
|
||||||
class OnTheFlyModelForm(forms.ModelForm):
|
class OnTheFlyModelForm(forms.ModelForm):
|
||||||
class Meta:
|
class Meta:
|
||||||
model = self.model
|
model = self.model
|
||||||
#fields = tuple(self._model_fields_set)
|
#fields = tuple(self._model_fields_set)
|
||||||
|
|
||||||
# Instantiate the ModelForm as appropriate
|
form = OnTheFlyModelForm
|
||||||
if data and isinstance(data, models.Model):
|
|
||||||
# Bound to an existing model instance
|
|
||||||
return OnTheFlyModelForm(instance=content)
|
|
||||||
elif data is not None:
|
|
||||||
return OnTheFlyModelForm(data, files)
|
|
||||||
return OnTheFlyModelForm()
|
|
||||||
|
|
||||||
# Both form and model not set? Okay bruv, whatevs...
|
# Both form and model not set? Okay bruv, whatevs...
|
||||||
|
if not form:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
# Instantiate the ModelForm as appropriate
|
||||||
|
if data is not None or files is not None:
|
||||||
|
if issubclass(form, forms.ModelForm) and hasattr(self.view, 'model_instance'):
|
||||||
|
# Bound to an existing model instance
|
||||||
|
return form(data, files, instance=self.view.model_instance)
|
||||||
|
else:
|
||||||
|
return form(data, files)
|
||||||
|
|
||||||
|
return form()
|
||||||
|
|
||||||
|
|
||||||
def url(self, instance):
|
def url(self, instance):
|
||||||
"""
|
"""
|
||||||
|
|
Loading…
Reference in New Issue
Block a user