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.
Contents
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)