Form Mixins

All of these mixins, with one exception, modify how forms are handled within views. The UserKwargModelFormMixin is a mixin for use in forms to auto-pop a user kwarg.

CsrfExemptMixin

If you have Django’s CSRF protection middleware enabled you can exempt views using the csrf_exempt decorator. This mixin exempts POST requests from the CSRF protection middleware without requiring that you decorate the dispatch method.

Note

This mixin should always be the left-most plugin.

from django.views.generic import UpdateView

from braces.views import LoginRequiredMixin, CsrfExemptMixin

from profiles.models import Profile


class UpdateProfileView(CsrfExemptMixin, LoginRequiredMixin, UpdateView):
    model = Profile

UserFormKwargsMixin

A common pattern in Django is to have forms that are customized to a user. To custom tailor the form for users, you have to pass that user instance into the form and, based on their permission level or other details, change certain fields or add specific options within the forms __init__ method.

This mixin automates the process of overloading the get_form_kwargs (this method is available in any generic view which handles a form) method and stuffs the user instance into the form kwargs. The user can then be pop()ped off in the form. Always remember to pop the user from the kwargs before calling super() on your form, otherwise the form will get an unexpected keyword argument.

Usage

from django.views.generic import CreateView

from braces.views import LoginRequiredMixin, UserFormKwargsMixin
from next.example import UserForm


class SomeSecretView(LoginRequiredMixin, UserFormKwargsMixin, CreateView):
    form_class = UserForm
    model = User
    template_name = "path/to/template.html"

This obviously pairs very nicely with the following mixin.

UserKwargModelFormMixin

The UserKwargModelFormMixin is a form mixin to go along with our UserFormKwargsMixin. This becomes the first inherited class of our forms that receive the user keyword argument. With this mixin, the pop()ping of the user is automated and no longer has to be done manually on every form that needs this behavior.

Usage

from braces.forms import UserKwargModelFormMixin


class UserForm(UserKwargModelFormMixin, forms.ModelForm):
    class Meta:
        model = User

    def __init__(self, *args, **kwargs):
        super(UserForm, self).__init__(*args, **kwargs)

        if not self.user.is_superuser:
            del self.fields["group"]

SuccessURLRedirectListMixin

The SuccessURLRedirectListMixin is a bit more tailored to how CRUD is often handled within CMSes. Many CMSes, by design, redirect the user to the ListView for whatever model they are working with, whether they are creating a new instance, editing an existing one, or deleting one. Rather than having to override get_success_url on every view, use this mixin and pass it a reversible route name. Example:

# urls.py
url(r"^users/$", UserListView.as_view(), name="users_list"),

# views.py
from django.views import CreateView

from braces import views


class UserCreateView(views.LoginRequiredMixin, views.PermissionRequiredMixin,
    views.SuccessURLRedirectListMixin, CreateView):

    form_class = UserForm
    model = User
    permission_required = "auth.add_user"
    success_list_url = "users_list"
    ...

FormValidMessageMixin

New in version 1.2.

The FormValidMessageMixin allows you to to statically or programmatically set a message to be returned using Django’s messages framework when the form is valid. The returned message is controlled by the form_valid_message property which can either be set on the view or returned by the get_form_valid_message method. The message is not processed until the end of the form_valid method.

Warning

This mixin requires the Django messages app to be enabled.

Note

This mixin is designed for use with Django’s generic form class-based views, e.g. FormView, CreateView, UpdateView

Static Example

from django.utils.translation import ugettext_lazy as _
from django.views.generic import CreateView

from braces.views import FormValidMessageMixin


class BlogPostCreateView(FormValidMessageMixin, CreateView):
    form_class = PostForm
    model = Post
    form_valid_message = _(u"Blog post created!")

Dynamic Example

from django.views.generic import CreateView

from braces.views import FormValidMessageMixin


class BlogPostCreateView(FormValidMessageMixin, CreateView):
    form_class = PostForm
    model = Post

    def get_form_valid_message(self):
        return u"{0} created!".format(self.object.title)

FormInvalidMessageMixin

New in version 1.2.

The FormInvalidMessageMixin allows you to to statically or programmatically set a message to be returned using Django’s messages framework when the form is invalid. The returned message is controlled by the form_invalid_message property which can either be set on the view or returned by the get_form_invalid_message method. The message is not processed until the end of the form_invalid method.

Warning

This mixin requires the Django messages app to be enabled.

Note

This mixin is designed for use with Django’s generic form class-based views, e.g. FormView, CreateView, UpdateView

Static Example

from django.utils.translation import ugettext_lazy
from django.views.generic import CreateView

from braces.views import FormInvalidMessageMixin


class BlogPostCreateView(FormInvalidMessageMixin, CreateView):
    form_class = PostForm
    model = Post
    form_invalid_message = _(u"Oh snap, something went wrong!")

Dynamic Example

from django.utils.translation import ugettext_lazy as _
from django.views.generic import CreateView

from braces.views import FormInvalidMessageMixin


class BlogPostCreateView(FormInvalidMessageMixin, CreateView):
    form_class = PostForm
    model = Post

    def get_form_invalid_message(self):
        return _(u"Some custom message")

FormMessagesMixin

New in version 1.2.

FormMessagesMixin is a convenience mixin which combines FormValidMessageMixin and FormInvalidMessageMixin since we commonly provide messages for both states (form_valid, form_invalid).

Warning

This mixin requires the Django messages app to be enabled.

Static & Dynamic Example

from django.utils.translation import ugettext_lazy as _
from django.views.generic import CreateView

from braces.views import FormMessagesMixin


class BlogPostCreateView(FormMessagesMixin, CreateView):
    form_class = PostForm
    form_invalid_message = _(u"Something went wrong, post was not saved")
    model = Post

    def get_form_valid_message(self):
        return u"{0} created!".format(self.object.title)