View --+------------------------- RedirectView | +-- GenericView -------+-- TemplateView | | | +-- FormView | +-- GenericModelView --+-- ListView | +-- DetailView | +-- CreateView | +-- UpdateView | +-- DeleteView
def get_form_kwargs(self): # ... if self.request.method in ('POST', 'PUT'): kwargs.update({ 'data': self.request.POST, 'files': self.request.FILES, }) return kwargs
form = self.get_form(request.DATA, request.FILES)
def get_form(self, data, files, instance=None): user = self.request.user return AccountForm(data, files, user=user, instance=instance)
def get_paginator(self, queryset, page_size): return CustomPaginator(queryset, page_size, orphans=3)
In particular...
"Write your own class based views"
Calling super can obfuscate
what's actually happening.
def get_context_data(self, **kwargs): context = super(MyView, self).get_context_data(**kwargs) context['user'] = self.request.user return context
def get_context_data(self, **kwargs): kwargs['object'] = self.object kwargs['user'] = self.request.user return kwargs
def form_valid(self, form): send_activation_email(self.request.user) return super(AccountActivationView, self).form_valid(form)
def form_valid(self, form): send_activation_email(self.request.user) form.save() return HttpResponseRedirect(self.success_url)
class MyView(LoginRequired, View): # ...
class MyView(View): permissions = (LoginRequired,)
Be an advocate for design restraint.
class AccountCreateView(CreateView): model = Account form_class = AccountForm def get_success_url(self): return self.object.account_activated_url() def get_form_kwargs(self): kwargs = super(AccountView, self).get_form_kwargs() kwargs['owner'] = self.request.user return kwargs def form_valid(self, form): send_activation_email(self.request.user) return super(AccountCreateView, self).form_valid(form)
class AccountCreateView(CreateView): model = Account
def get_form(self, data=None, files=None, instance=None):
owner = self.request.user
return AccountForm(data, files, instance=instance, owner=owner) def form_valid(self, form): send_activation_email(self.request.user) account = form.save() return HttpResponseRedirect(account.account_activated_url())