SELECT * FROM table1 LEFT JOIN table2 on table1.id = table2.id
CBV хороши, когда вам нужно наследование или вам нужно иметь дело с разными методами HTTP, чтобы иметь один и тот же маршрут. Если это не так, FBV - лучший выбор. При этом, для того, что вы пытаетесь сделать, вы должны просто FormView
, который будет обрабатывать все о почте и формах.
Что-то вроде:
class BookViewSet(FormView):
form = CommentForm
template_name = 'catalog/book_detail.html'
def form_valid(self, form):
self.send_mail(form.cleaned_data)
return super(BookViewSet, self).form_valid(form)
Если вы работаете с формами, вы должны использовать CreateView или FormView, а не DetailView. Вот пример реализации, который, как видите, немного сложен для новичка в Django:
from django.views.generic import CreateView
class BookDetailView(NeverCacheMixin, CreateView):
form_class = CommentForm
template_name = 'catalog/book_detail.html'
def dispatch(self, request, *args, **kwargs):
book_slug = self.kwargs.get('slug') # url variables are stored in self.kwargs
self.book = get_object_or_404(Book, slug=book_slug) # attach book to your view
return super().dispatch(request, *args, **kwargs)
def get_context_data(self, **kwargs):
# context data passed to template
kwargs['book'] = self.book
kwargs['most_recent'] = Book.objects.order_by('-timestamp')[:3]
if request.user.is_anonymous:
user_membership = None
else:
try:
user_membership = Customer.objects.get(user=self.request.user)
except Customer.DoesNotExist:
user_membership = None
kwargs['user_membership'] = user_membership
return super().get_context_data(**kwargs)
def form_valid(self, form):
instance = form.save(commit=False)
instance.user = self.request.user
instance.post = self.book
instance.save()
return redirect(self.book.get_absolute_url())