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 хостинг.

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

Пікірлер

Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
Кіріңіз немесе Тіркеліңіз
AD

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

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

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

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

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

  • Нәтиже:20ұпай,
  • Бағалау ұпайлары-10
Соңғы пікірлер
i
innorwallҚар. 14, 2024, 9:09 Т.Ж.
Qt/C++ - 068-сабақ. CLion жүйесінде CMAKE құрастыру жүйесін пайдаланатын Hello World ditropan pristiq dosing With the Yankees leading, 4 3, Rivera jogged in from the bullpen to a standing ovation as he prepared for his final appearance in Chicago buy priligy pakistan
i
innorwallҚар. 14, 2024, 4:05 Т.Ж.
ЖАМАНДЫҚ ЯРЕК. Google reCAPTCHA пайдалану 2001; 98 29 34 priligy buy
i
innorwallҚар. 14, 2024, 2:54 Т.Ж.
Джанго - Сабақ 003. Джангодағы үлгі, үлгі және көрініс Hair follicles are believed to produce approximately 20 individual hair shafts over the life of the follicle as the follicle progresses through cycles of hair production, shedding ejection, invo…
i
innorwallҚар. 13, 2024, 11:03 Т.Қ.
Qt тілінде ойын қалай жазылады - 3-сабақ. Басқа объектілермен әрекеттесу what is priligy tablets What happens during the LASIK surgery process
Енді форумда талқылаңыз
i
innorwallҚар. 14, 2024, 3:39 Т.Ж.
добавить qlineseries в функции priligy amazon canada 93 GREB1 protein GREB1 AB011147 6
i
innorwallҚар. 11, 2024, 10:55 Т.Ж.
Всё ещё разбираюсь с кешем. priligy walgreens levitra dulcolax carbs The third ring was found to be made up of ultra relativistic electrons, which are also present in both the outer and inner rings
9
9AnonimҚаз. 25, 2024, 9:10 Т.Ж.
Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

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