В предыдущем посте я создал простую Django модель BlogPost
, которая хранит данные, как показано ниже.
class Post(models.Model):
title = models.CharField(verbose_name='title', max_length=255, null=False)
content = models.TextField(verbose_name='content', null=False, blank=True)
created_on = models.DateTimeField(auto_now=True, auto_created=True, null=False, blank=False)
published_on = models.DateTimeField(null=True)
updated_on = models.DateTimeField(null=True)
Но у нее нет поля slug, поэтому я добавляю его, как показано ниже.
from typing import Iterable, Optional
from django.db import models
# Create your models here.
class Post(models.Model):
title = models.CharField(verbose_name='title', max_length=255, null=False)
content = models.TextField(verbose_name='content', null=False, blank=True)
created_on = models.DateTimeField(auto_now=True, auto_created=True, null=False, blank=False)
published_on = models.DateTimeField(null=True)
updated_on = models.DateTimeField(null=True)
slug = models.SlugField(verbose_name='slug', max_length=255, unique=True)
def save(self, force_insert: bool = ..., force_update: bool = ..., using: Optional[str] = ..., update_fields: Optional[Iterable[str]] = ...) -> None:
return super().save(force_insert, force_update, using, update_fields)
Здесь также добавлен новый метод. Не волнуйтесь, вам не нужно запоминать его, просто введите def save
под моделью в вашем редакторе кода и он автоматически заполнит метод save()
базового класса models.Model
Также из typing import Iterable, Optional
для работы с необязательными значениями.
Существует функция slugify()
во встроенном модуле django django.utils.text
просто импортируйте ее и измените последний метод save(), как показано ниже.
def save(self, *args, **kwargs):
if not self.slug:
self.slug = slugify(self.title)
super(Post, self).save(*args, **kwargs)
Теперь это может сделать наш slug легко, но это будет иметь проблемы, например, мы не можем создавать посты с одинаковым названием, поэтому мы добавим новую функцию здесь.
import random
from typing import Iterable, Optional
from django.db import models
from django.utils.text import slugify
def random_words():
return ''.join(random.choice('abcdefghijklmnopqrstuvwxyz0123456789'.split('')) for _ in range(6))
# Create your models here.
class Post(models.Model):
title = models.CharField(verbose_name='title', max_length=255, null=False)
content = models.TextField(verbose_name='content', null=False, blank=True)
created_on = models.DateTimeField(auto_now=True, auto_created=True, null=False, blank=False)
published_on = models.DateTimeField(null=True)
updated_on = models.DateTimeField(null=True)
slug = models.SlugField(verbose_name='slug', max_length=255, unique=True)
def save(self, *args, **kwargs):
if not self.slug:
self.slug = slugify(self.title + random_words())
super(Post, self).save(*args, **kwargs)
Здесь мы добавили модуль random и функции random_words()
для автоматического создания slug, если он не задан.
Также зарегистрируйте эту модель в admin.py
из папки приложения blog
, как показано ниже.
from django.contrib import admin
# Register your models here.
from .models import Post
admin.site.register(Post)
В результате форма создания после переноса базы данных будет выглядеть так, как показано ниже.
Ссылка на репозиторий
сборка shriekdj_cms на django
Заключение
Если вы нашли это полезным, пожалуйста, поделитесь этим и следуйте за мной! Также загляните на Buy Me A Coffee, если вы хотите поддержать меня на новом уровне!