Commit 2e909489 authored by Chris Beaven's avatar Chris Beaven
Browse files

Add FormMixin.get_form_kwargs method to abstract some common logic in a tidier

way. Tidy up (and amend) documentation about FormMixin and ModelFormMixin.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@14865 bcc190cf-cafb-0310-a4f2-bffc1f526a37
parent ff8711a8
Loading
Loading
Loading
Loading
+17 −23
Original line number Diff line number Diff line
@@ -31,16 +31,19 @@ class FormMixin(object):
        """
        Returns an instance of the form to be used in this view.
        """
        return form_class(**self.get_form_kwargs())

    def get_form_kwargs(self):
        """
        Returns the keyword arguments for instanciating the form.
        """
        kwargs = {'initial': self.get_initial()}
        if self.request.method in ('POST', 'PUT'):
            return form_class(
                data=self.request.POST,
                files=self.request.FILES,
                initial=self.get_initial()
            )
        else:
            return form_class(
                initial=self.get_initial()
            )
            kwargs.update({
                'data': self.request.POST,
                'files': self.request.FILES,
            })
        return kwargs

    def get_context_data(self, **kwargs):
        return kwargs
@@ -75,22 +78,13 @@ class ModelFormMixin(FormMixin, SingleObjectMixin):
            model = self.get_queryset().model
            return model_forms.modelform_factory(model)

    def get_form(self, form_class):
    def get_form_kwargs(self):
        """
        Returns a form instantiated with the model instance from get_object().
        Returns the keyword arguments for instanciating the form.
        """
        if self.request.method in ('POST', 'PUT'):
            return form_class(
                data=self.request.POST,
                files=self.request.FILES,
                initial=self.get_initial(),
                instance=self.object,
            )
        else:
            return form_class(
                initial=self.get_initial(),
                instance=self.object,
            )
        kwargs = super(ModelFormMixin, self).get_form_kwargs()
        kwargs.update({'instance': self.object})
        return kwargs

    def get_success_url(self):
        if self.success_url:
+22 −17
Original line number Diff line number Diff line
@@ -413,27 +413,34 @@ FormMixin
    .. method:: get_initial()

        Retrieve initial data for the form. By default, returns
        :attr:`FormMixin.initial`.
        :attr:`.initial`.

    .. method:: get_form_class()

        Retrieve the form class to instantiate. By default,
        :attr:`FormMixin.form_class`.
        Retrieve the form class to instantiate. By default
        :attr:`.form_class`.

    .. method:: get_form(form_class)

        Instantiate an instance of ``form_class``. If the request is a ``POST``
        or ``PUT``, the request data (``request.POST`` and ``request.FILES``)
        will be provided to the form at time of construction.
        Instantiate an instance of ``form_class`` using
        :meth:`.get_form_kwargs`.

    .. method:: get_form_kwargs()

        Build the keyword arguments requried to instanciate an the form.
        
        The ``initial`` argument is set to :meth:`.get_initial`. If the
        request is a ``POST`` or ``PUT``, the request data (``request.POST``
        and ``request.FILES``) will also be provided.

    .. method:: get_success_url()

        Determine the URL to redirect to when the form is successfully
        validated. Returns :attr:`FormMixin.success_url` by default.
        validated. Returns :attr:`.success_url` by default.

    .. method:: form_valid()

        Redirects to :attr:`ModelFormMixin.success_url`.
        Redirects to :meth:`.get_success_url`.

    .. method:: form_invalid()

@@ -449,9 +456,9 @@ FormMixin

    .. note::

        Views mixing :class:`~django.views.generic.edit.FormMixin` must
        provide an implementation of :meth:`~FormMixin.form_valid` and
        :meth:`~FormMixin.form_invalid`.
        Views mixing :class:`FormMixin` must
        provide an implementation of :meth:`.form_valid` and
        :meth:`.form_invalid`.

ModelFormMixin
~~~~~~~~~~~~~~
@@ -490,12 +497,10 @@ ModelFormMixin
        :attr:`~SingleObjectMixin.model`, depending on which attribute is
        provided.

    .. method:: get_form(form_class)
    .. method:: get_form_kwargs()

        Instantiate an instance of ``form_class``. If the request is a ``POST``
        or ``PUT``, the request data (``request.POST`` and ``request.FILES``)
        will be provided to the form at time of construction. The current
        instance (``self.object``) will also be provided.
        Add the current instance (``self.object``) to the standard
        :meth:`FormMixin.get_form_kwargs`.

    .. method:: get_success_url()

@@ -506,7 +511,7 @@ ModelFormMixin
    .. method:: form_valid()

        Saves the form instance, sets the current object for the view, and
        redirects to :attr:`ModelFormMixin.success_url`.
        redirects to :meth:`.get_success_url`.

    .. method:: form_invalid()