Настройка поля Slug для модели поста | Django CMS Building By shriekdj

В предыдущем посте я создал простую 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

Посмотреть на GitHub

Заключение

Если вы нашли это полезным, пожалуйста, поделитесь этим и следуйте за мной! Также загляните на Buy Me A Coffee, если вы хотите поддержать меня на новом уровне!

Оцените статью
devanswers.ru
Добавить комментарий