Evgenii Legotckoi
Evgenii LegotckoiНаурыз 26, 2017, 1:45 Т.Ж.

Django - Оқулық 021. Модельдік мұра, абстрактілі модель

Мазмұны

Сайтта рефакторингтен кейін төрт негізгі нысан анықталды, оларда ортақ қасиеттер анықталды, атап айтқанда:

  • Мақалалар - Мақалалар
  • Пікір - Түсініктемелер
  • ForumTopic - Форум тақырыптары (мысалы, сұрақтар)
  • ForumPost - форум тақырыптарына жауаптар

Әрине, бұл нысандарда бірдей деректер өрістері, бірдей әдістер және т.б. болуы мүмкін екені анық болды. Бірақ бұл сайтты әзірлеу барысында мен өзім бір уақытта Python және Django тілдерін үйреніп жатырмын. Сондықтан жоба ең жақсы тәсілдерді үйрену кезінде рефакторингтен кейін шағын ToDos-ті ретсіз енгізу сипатында. Сондықтан, Джангодағы үлгілердің мұрагерлік мүмкіндіктерін зерттегеннен кейін, жоғарыда аталған модельдердің барлығында қайталанатын төрт өрісі бар бір жалпы дерексіз деректер моделі PostBase бөлектелді.

Мұнда бір маңызды мәселе бар: Дерексіз деп жарияланған модель дерекқорда кесте жасамайды.

Абстрактілі үлгі жасау үшін Meta. класы үшін абстракт айнымалы мәнін True мәніне орнату керек.


PostBase

PostBase - бұл базалық дерексіз модель болады. Бұл дерексіз деректер үлгісінде жоғарыда аталған үлгілерге ортақ төрт өріс анықталды:

  • автор – мақаланың, түсініктеменің, тақырыптың немесе жауаптың авторы;
  • мазмұн – мазмұн;
  • pub_date – жарияланған күні;
  • модерация - модерация, барлық мазмұнда төрт мүмкін нұсқа болуы мүмкін:
  • СПАМ - түсініктемелер жоқ;
  • NOT_MODERATED - расталмаған жазба, бұл жағдайда осы мәртебеге ие пайдаланушылардың мақалалары модерацияға дейін басқа пайдаланушыларға қолжетімді болмайды;
  • POST_MODERATED - жарияланғаннан кейін модерация, пайдаланушының мақаласы жарияланғаннан кейін басқа пайдаланушыларға қолжетімді болады, бірақ ол әлі модерациядан өткен жоқ;
  • MODERATED - хабарлама модерацияланды.

Бұл дерексіз модельдің мәлімдемесі келесідей болады:

# -*- coding: utf-8 -*-

from django.db import models
from django.contrib.auth.models import User
from django.utils.translation import ugettext_lazy as _

from ckeditor_uploader.fields import RichTextUploadingField

class PostBase(models.Model):
    class Meta:
        abstract = True    # данное поле указывает, что класс абстрактный
                           # и что для него не нужно создавать таблицу

    SPAM = 'S'
    NOT_MODERATED = 'N'
    POST_MODERATED = 'P'
    MODERATED = 'M'
    MODERATION_CHOICES = (
        (SPAM, 'SPAM'),
        (NOT_MODERATED, 'Not Moderated'),
        (POST_MODERATED, 'Post Moderated'),
        (MODERATED, 'Moderated')
    )

    author = models.ForeignKey(User, verbose_name=_("Автор"))
    content = models.TextField(_('Содержание'), blank=True)
    pub_date = models.DateTimeField(_('Дата публикации'), blank=True, null=True)
    moderation = models.CharField(
        _('Модерация'),
        max_length=1,
        choices=MODERATION_CHOICES,
        default=NOT_MODERATED
    )

Осылайша, жобаның бағдарламалық кодын азайтуға және қайталанатын кодты қайта пайдалану мүмкіндігін қосуға болады.

Үлгінің құрылымы, мысалы, пікірлер үшін енді келесідей болуы мүмкін:

class Comment(PostBase):
    class Meta:
        db_table = "comments"

    article = models.ForeignKey(Article)

автор , pub_date , мазмұн және модерация өрістерін енді көрсету қажет емес, өйткені олар PostBase сыныбында бар. Ең бастысы, үлгідегі PostBase. үлгісіндегідей атаулары бар өрістерді енгізбеңіз.

PostBaseAdmin

Сондай-ақ, сөзсіз артықшылығы - сіз барлық сыныптарға ортақ бір басқару тақтасының параметрін жасай аласыз.

Мысалы, өрістерді көрсетуді, мазмұнды іздеуді және сүзуді орнатуды және модерация күйін орнату мүмкіндігін (яғни, сәйкес әрекеттерді қосу) жасайық.

class PostBaseAdmin(admin.ModelAdmin):
    list_display = ('content', 'author', 'pub_date')
    search_fields = ('content', 'author__username')
    list_filter = ('moderation',)
    actions = ['make_spam', 'make_not_moderated', 'make_post_moderated', 'make_moderated']

    def moderate(self, request, rows_updated, choice_description):
        if rows_updated == 1:
            message_bit = "1 запись помечена, как %s" % choice_description
        else:
            message_bit = "%s записей отмечены, как %s." % (rows_updated, choice_description)
        self.message_user(request, "%s" % message_bit)

    def make_spam(self, request, queryset):
        self.moderate(
            request=request,
            rows_updated=queryset.update(moderation=PostBase.SPAM),
            choice_description="SPAM"
        )
    make_spam.short_description = "Отметить помеченные, как SPAM"

    def make_not_moderated(self, request, queryset):
        self.moderate(
            request=request,
            rows_updated=queryset.update(moderation=PostBase.NOT_MODERATED),
            choice_description="NOT_MODERATED"
        )
    make_not_moderated.short_description = "Отметить помеченные, как NOT_MODERATED"

    def make_post_moderated(self, request, queryset):
        self.moderate(
            request=request,
            rows_updated=queryset.update(moderation=PostBase.POST_MODERATED),
            choice_description="POST_MODERATED"
        )
    make_post_moderated.short_description = "Отметить помеченные, как POST_MODERATED"

    def make_moderated(self, request, queryset):
        self.moderate(
            request=request,
            rows_updated=queryset.update(moderation=PostBase.MODERATED),
            choice_description="MODERATED"
        )
    make_moderated.short_description = "Отметить помеченные, как MODERATED"

Сүзу тізімдерін кеңейту немесе кейбір үлгілер үшін әрекеттерді қосқыңыз келсе, PostBaseAdmin ішінен келесідей мұраға алуға болады:

class ArticleAdmin(PostBaseAdmin):
    # Либо полностью переопределить отображаемые поля или поля для поиска
    list_display = ('title', 'section', 'author', 'pub_date', 'views', 'moderation')
    search_fields = ('title', 'author__username', 'section__title')
    # Либо добавить к существующему списку дополнительные
    list_filter = PostBaseAdmin.list_filter + ('status', 'section')
    # В случае actions подобное объявление просто добавит новые actions к существующим
    actions = ['publish', 'unpublish']

Django үшін Timeweb хостының VDS-сервері ұсынамын.

Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Ол саған ұнайды ма? Әлеуметтік желілерде бөлісіңіз!

Пікірлер

Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
Кіріңіз немесе Тіркеліңіз
OI
  • Ora Iro
  • Жел. 24, 2024, 5:38 Т.Қ.

C++ - Тест 001. Первая программа и типы данных

  • Нәтиже:40ұпай,
  • Бағалау ұпайлары-8
AD

C++ - Тест 004. Указатели, Массивы и Циклы

  • Нәтиже:50ұпай,
  • Бағалау ұпайлары-4
m
  • molni99
  • Қаз. 26, 2024, 11:37 Т.Ж.

C++ - Тест 004. Указатели, Массивы и Циклы

  • Нәтиже:80ұпай,
  • Бағалау ұпайлары4
Соңғы пікірлер
ИМ
Игорь МаксимовҚар. 22, 2024, 10:51 Т.Қ.
Django - Оқулық 017. Теңшелген Django кіру беті Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
Evgenii Legotckoi
Evgenii LegotckoiҚар. 1, 2024, 12:37 Т.Ж.
Django - Сабақ 064. Python Markdown кеңейтімін қалай жазуға болады Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
A
ALO1ZEҚаз. 19, 2024, 6:19 Т.Қ.
Qt Creator көмегімен fb3 файл оқу құралы Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
ИМ
Игорь МаксимовҚаз. 5, 2024, 5:51 Т.Қ.
Django - Сабақ 064. Python Markdown кеңейтімін қалай жазуға болады Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas5Шілде 5, 2024, 9:02 Т.Қ.
QML - Сабақ 016. SQLite деректер қоры және онымен QML Qt-та жұмыс істеу Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
Енді форумда талқылаңыз
Evgenii Legotckoi
Evgenii LegotckoiМаусым 25, 2024, 1:11 Т.Ж.
добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
t
tonypeachey1Қар. 15, 2024, 5:04 Т.Қ.
google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
NSProject
NSProjectМаусым 4, 2022, 1:49 Т.Қ.
Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…
9
9AnonimҚаз. 25, 2024, 7:10 Т.Қ.
Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

Бізді әлеуметтік желілерде бақылаңыз