class Post(models.Model):
options = (
("draft", "Draft"),
("published", "Published")
)
title = models.CharField(max_length=250)
slug = models.SlugField(max_length=250, unique_for_date="publish")
publish = models.DateTimeField(default=timezone.now)
author = models.ForeignKey(User, on_delete=models.CASCADE, related_name="blog_posts")
content = models.TextField()
status = models.CharField(max_length=10, choices=options, default="draft")
def __str__(self):
return self.title
from django.utils.text import slugify
class Post(models.Model):
options = (
("draft", "Draft"),
("published", "Published")
)
title = models.CharField(max_length=250)
slug = models.SlugField(max_length=250, unique_for_date="publish")
publish = models.DateTimeField(default=timezone.now)
author = models.ForeignKey(User, on_delete=models.CASCADE, related_name="blog_posts")
content = models.TextField()
status = models.CharField(max_length=10, choices=options, default="draft")
def __str__(self):
return self.title
def save(self, *args, **kwargs):
# Jeśli slug nie jest ustawiony, generujemy go na podstawie tytułu
if not self.slug:
self.slug = slugify(self.title)
# Wywołujemy metodę save() klasy bazowej
super(Post, self).save(*args, **kwargs)
To, że SlugField nie waliduje automatycznie formatu danych w metodzie save(), jest zgodne z filozofią Django.
Design Django mówi, że walidacja odbywa się w innych etapach.
- Na poziomie formularzy.
- Na poziomie metod clean() i walidatorów o ile wymusisz ich działanie i ręcznie wywołasz metodę full_clean.
Metoda save() w Django służy do zapisu danych do bazy, ale domyślnie nie waliduje danych.
Django przyjmuje, że dane są poprawne, ponieważ zakłada się, że walidacja powinna zostać przeprowadzona wcześniej
(np. w formularzach lub ręcznie przez programistę).
Dlaczego SlugField działa w ten sposób?
Django rozdziela odpowiedzialność między warstwę modelu a formularzy (i innych customych operacji), aby dać większą elastyczność:
1. Model:
W modelu możesz zapisać dowolne dane, jeśli nie narzucisz dodatkowych ograniczeń.
Django zakłada, że programista wie, co robi.
2. Formularze i inne customowe operacji (jak wymuszona walidacja):
Formularze Django, to miejsce, gdzie zazwyczaj odbywa się walidacja danych od użytkownika.
W przypadku SlugField, formularze automatycznie sprawdzają poprawność formatu.
Można customowo wymusić wywołanie walidacji na modelu (full_clean), ale to dalej jest zgodne z założeniem, że programista wie co robi.