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.
Contents
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
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()``ed 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.
from django.views.generic import CreateView
from braces.views import LoginRequiredMixin, UserFormKwargsMixin
from next.example import UserForm
class SomeSecretView(LoginRequiredMixin, UserFormKwargsMixin,
TemplateView):
form_class = UserForm
model = User
template_name = "path/to/template.html"
This obviously pairs very nicely with the following mixin.
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()``ing of the ``user is automated and no longer has to be done manually on every form that needs this behavior.
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"
...
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
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!")
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)
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
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!")
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")
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.
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)