Создание пользовательского профиля и тегов | Django CMS Building By shriekdj

Итак, сейчас я пытаюсь создать 2 новые модели для CMS — профиль пользователя и теги блога, но перед этим я хочу сказать о некоторых изменениях, сделанных в репозитории GitHub во время работы над серией.

Я просто переименовал проект Django из dj_admin в config, потому что это должно быть правильно для понимания и запуска проекта. Также я удалил метод save() модели Post Model, поле slug модели Post Model и функцию random_words(), потому что они создавали некоторые ошибки при переносе проекта.

Итак, теперь Post Model Django выглядит следующим образом

# Create your models here.
class Post(models.Model):
    id = models.BigAutoField(primary_key=True)
    title = models.CharField(verbose_name='title', max_length=255, null=False)
    content = models.TextField(verbose_name='content', null=False, blank=True)
    created_at = models.DateTimeField(verbose_name='created_at',auto_now=True, auto_created=True, null=False, blank=False)
    published_at = models.DateTimeField(verbose_name='published_at',null=True)
    updated_at = models.DateTimeField(verbose_name='updated_at',null=True)
    slug = models.SlugField(verbose_name='slug', max_length=50, unique=True)
Вход в полноэкранный режим Выйти из полноэкранного режима

После создания модели записи блога нам понадобится модель профиля автора / пользователя, и мы знаем, что эта модель должна быть вверху модели записи.

Для создания профиля пользователя мы импортируем модель Auth User Model из Django с полем one-to-one для использования в нашем блоге напишите следующий код вверху модели Post Model.

from django.conf import settings
class Profile(models.Model):
    user = models.OneToOneField(
        settings.AUTH_USER_MODEL,
        on_delete=models.PROTECT,
    )
    website = models.URLField(blank=True)
    bio = models.CharField(max_length=240, blank=True)

    def __str__(self):
        return self.user.get_username()
Вход в полноэкранный режим Выход из полноэкранного режима

Здесь я добавил on_delete=models.PROTECT для предотвращения удаления профиля.

Также добавил Tag Model в приложение blog между Profile Model и Post Model.

class Tag(models.Model):
    name = models.CharField(max_length=50, unique=True, null=False)
    slug = models.SlugField(verbose_name='slug', max_length=50, unique=True)

    def __str__(self) -> str:
        return self.name
Вход в полноэкранный режим Выход из полноэкранного режима

Я также добавил несколько новых полей в Post Model, таких как subtitle, meta_description, is_published, а также добавил author как Foreign-Key (мы считаем только одного автора для поста) и tags как Many to Many, потому что многие посты могут иметь теги и наоборот.

После обновления модели постов она выглядит так, как показано ниже

# Create your models here.
class Post(models.Model):
    id = models.BigAutoField(primary_key=True)
    title = models.CharField(verbose_name='title', max_length=255, null=False)
    subtitle = models.CharField(max_length=255, blank=True)
    content = models.TextField(verbose_name='content', null=False, blank=True)
    meta_description = models.CharField(max_length=150, blank=True)
    created_at = models.DateTimeField(verbose_name='created_at',auto_now=True, auto_created=True, null=False, blank=False)
    updated_at = models.DateTimeField(verbose_name='updated_at',null=True)
    published_at = models.DateTimeField(verbose_name='published_at',null=True, blank=True)
    is_published = models.BooleanField(verbose_name='is_published', default=False)
    slug = models.SlugField(verbose_name='slug', max_length=50, unique=True)

    author = models.ForeignKey(Profile, on_delete=models.PROTECT, default=None)
    tags = models.ManyToManyField(Tag, blank=True)
Войдите в полноэкранный режим Выход из полноэкранного режима

Также необходимо обновить admin.py в блоге до вида, показанного ниже.

from django.contrib import admin

# Register your models here.
from blog.models import Profile, Post, Tag

@admin.register(Profile)
class ProfileAdmin(admin.ModelAdmin):
    model = Profile

@admin.register(Tag)
class TagAdmin(admin.ModelAdmin):
    model = Tag

@admin.register(Post)
class PostAdmin(admin.ModelAdmin):
    model = Post

    list_display = (
        "id",
        "title",
        "subtitle",
        "slug",
        "published_at",
        "is_published",
    )
    list_filter = (
        "is_published",
        "published_at",
    )
    list_editable = (
        "title",
        "subtitle",
        "slug",
        "published_at",
        "is_published",
    )
    search_fields = (
        "title",
        "subtitle",
        "slug",
        "body",
    )
    prepopulated_fields = {
        "slug": (
            "title",
            "subtitle",
        )
    }
    date_hierarchy = "published_at"
    save_on_top = True
Войти в полноэкранный режим Выход из полноэкранного режима

Также ниже приведен скриншот добавления поста в панели администратора

Ниже приведена ссылка на мой репозиторий на GitHub

shriekdj / shriekdj_cms

сборка shriekdj_cms на django

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

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