Advertisement
horozov86

Override save() & form_valid() in CBV

Sep 19th, 2024 (edited)
51
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.18 KB | None | 0 0
  1. Пренаписване на метода save() и form_valid() в class based views
  2.  
  3. 1. Ако пренапишеm метода save() в МОДЕЛА, логиката ще се прилага за всички бъдещи view-та, които записват или актуализират обекта, независимо дали са CreateView, UpdateView, или друг начин за създаване/промяна на обекти.
  4.  
  5. from django.db import models
  6. from django.utils import timezone
  7.  
  8. class BlogPost(models.Model):
  9.     title = models.CharField(max_length=255)
  10.     content = models.TextField()
  11.     author = models.ForeignKey('auth.User', on_delete=models.CASCADE)
  12.     published_date = models.DateTimeField(blank=True, null=True)
  13.     views = models.IntegerField(default=0)
  14.  
  15.     def save(self, *args, **kwargs):
  16.         if not self.published_date:
  17.             self.published_date = timezone.now()
  18.         if not self.author:
  19.             self.author = kwargs.pop('user', None)
  20.         super().save(*args, **kwargs)
  21.  
  22.  
  23. 2. Ако пренапишем само form_valid() в CreateView или UpdateView, тогава тази логика ще се прилага само за конкретното view. В другите view-та ще трябва отново да я имплементираш.
  24.  
  25. from django.urls import reverse_lazy
  26. from django.utils import timezone
  27. from django.views.generic import CreateView
  28. from .models import BlogPost
  29. from .forms import BlogPostForm
  30.  
  31. class BlogPostCreateView(CreateView):
  32.     model = BlogPost
  33.     form_class = BlogPostForm
  34.     template_name = 'create_blog_post.html'
  35.     success_url = reverse_lazy('success_view')
  36.  
  37.     def form_valid(self, form):
  38.         # Пренаписваме формата преди да запишем
  39.         instance = form.save(commit=False)
  40.         instance.author = self.request.user  # Задаваме текущия потребител като автор
  41.         instance.published_date = timezone.now()  # Задаваме текущата дата и час
  42.         instance.save()  # Записваме в базата данни
  43.         return super().form_valid(form)
  44.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement