CCCPaste

Override save() & form_valid() in CBV

Пренаписване на метода 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)