Пренаписване на метода save() и form_valid() в class based views
1. Ако пренапишеm метода save() в МОДЕЛА, логиката ще се прилага за всички бъдещи view-та, които записват или актуализират обекта, независимо дали са CreateView, UpdateView, или друг начин за създаване/промяна на обекти.
from django.db import models
from django.utils import timezone
class BlogPost(models.Model):
title = models.CharField(max_length=255)
content = models.TextField()
author = models.ForeignKey('auth.User', on_delete=models.CASCADE)
published_date = models.DateTimeField(blank=True, null=True)
views = models.IntegerField(default=0)
def save(self, *args, **kwargs):
if not self.published_date:
self.published_date = timezone.now()
if not self.author:
self.author = kwargs.pop('user', None)
super().save(*args, **kwargs)
2. Ако пренапишем само form_valid() в CreateView или UpdateView, тогава тази логика ще се прилага само за конкретното view. В другите view-та ще трябва отново да я имплементираш.
from django.urls import reverse_lazy
from django.utils import timezone
from django.views.generic import CreateView
from .models import BlogPost
from .forms import BlogPostForm
class BlogPostCreateView(CreateView):
model = BlogPost
form_class = BlogPostForm
template_name = 'create_blog_post.html'
success_url = reverse_lazy('success_view')
def form_valid(self, form):
# Пренаписваме формата преди да запишем
instance = form.save(commit=False)
instance.author = self.request.user # Задаваме текущия потребител като автор
instance.published_date = timezone.now() # Задаваме текущата дата и час
instance.save() # Записваме в базата данни
return super().form_valid(form)