Skip to content

Instantly share code, notes, and snippets.

@allieus
Last active August 29, 2015 14:19
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save allieus/4e62da14b33bb4384aaa to your computer and use it in GitHub Desktop.
Save allieus/4e62da14b33bb4384aaa to your computer and use it in GitHub Desktop.
Django, Class Based View, Helper
from django.core.urlresolvers import reverse
class PostUpdateView(BaseUpdateView):
model = Post
form_class = PostForm
# template_context = {'form_title': 'form title'}
template_context = lambda self: {'form_title': '<%s> edit' % self.object.name}
# valid_message = lambda self: 'updated'
# valid_message = lambda self: ('info', '<%s> updated' % self.get_object().name)
valid_message = lambda self: [
('info', '<%s> updated' % self.get_object().name),
('debug', '<%s> updated (debug)' % self.get_object().name),
]
success_url_fn = lambda self: reverse('post:detail', args=[self.object.id])
from django.contrib import messages as django_messages
from django.utils import six
from django.views.generic import ListView, DetailView, CreateView, UpdateView, DeleteView
from django.views.generic.base import ContextMixin
from django.views.generic.edit import FormMixin
MESSAGE_LEVELS = {
'debug': django_messages.DEBUG,
'info': django_messages.INFO,
'success': django_messages.SUCCESS,
'warning': django_messages.WARNING,
'error': django_messages.ERROR,
}
class BaseContextMixin(ContextMixin):
template_context = {}
def get_context_data(self, *args, **kwargs):
data = super(BaseContextMixin, self).get_context_data(*args, **kwargs)
if callable(self.template_context):
data.update(self.template_context())
else:
data.update(self.template_context)
return data
class BaseFormMixin(FormMixin):
valid_message = None
success_url_fn = None
def form_valid(self, form):
response = super(BaseFormMixin, self).form_valid(form)
if self.valid_message is not None:
if callable(self.valid_message):
messages = self.valid_message()
else:
messages = self.valid_message
if not isinstance(messages, (tuple, list)):
messages = [messages]
for row in messages:
if callable(row):
row = row(self)
if isinstance(row, (tuple, list)):
level, message = row
else:
level = django_messages.INFO
message = row
if isinstance(level, six.string_types):
try:
level = MESSAGE_LEVELS[level]
except KeyError:
pass
django_messages.add_message(self.request, level, message)
return response
def get_success_url(self):
if callable(self.success_url_fn):
self.success_url = self.success_url_fn()
return super(BaseFormMixin, self).get_success_url()
class BaseListView(BaseContextMixin, ListView):
pass
class BaseDetailView(BaseContextMixin, DetailView):
pass
class BaseCreateView(BaseContextMixin, BaseFormMixin, CreateView):
pass
class BaseUpdateView(BaseContextMixin, BaseFormMixin, UpdateView):
pass
class BaseDeleteView(BaseContextMixin, BaseFormMixin, DeleteView):
pass
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment