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 = Accountdef get_form(self, data=None, files=None, instance=None):owner = self.request.userreturn 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())