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

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

Мазмұны

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

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

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

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

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


PostBase

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

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

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

  1. # -*- coding: utf-8 -*-
  2.  
  3. from django.db import models
  4. from django.contrib.auth.models import User
  5. from django.utils.translation import ugettext_lazy as _
  6.  
  7. from ckeditor_uploader.fields import RichTextUploadingField
  8.  
  9. class PostBase(models.Model):
  10. class Meta:
  11. abstract = True # данное поле указывает, что класс абстрактный
  12.   # и что для него не нужно создавать таблицу
  13.  
  14. SPAM = 'S'
  15. NOT_MODERATED = 'N'
  16. POST_MODERATED = 'P'
  17. MODERATED = 'M'
  18. MODERATION_CHOICES = (
  19. (SPAM, 'SPAM'),
  20. (NOT_MODERATED, 'Not Moderated'),
  21. (POST_MODERATED, 'Post Moderated'),
  22. (MODERATED, 'Moderated')
  23. )
  24.  
  25. author = models.ForeignKey(User, verbose_name=_("Автор"))
  26. content = models.TextField(_('Содержание'), blank=True)
  27. pub_date = models.DateTimeField(_('Дата публикации'), blank=True, null=True)
  28. moderation = models.CharField(
  29. _('Модерация'),
  30. max_length=1,
  31. choices=MODERATION_CHOICES,
  32. default=NOT_MODERATED
  33. )

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

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

  1. class Comment(PostBase):
  2. class Meta:
  3. db_table = "comments"
  4.  
  5. article = models.ForeignKey(Article)

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

PostBaseAdmin

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

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

  1. class PostBaseAdmin(admin.ModelAdmin):
  2. list_display = ('content', 'author', 'pub_date')
  3. search_fields = ('content', 'author__username')
  4. list_filter = ('moderation',)
  5. actions = ['make_spam', 'make_not_moderated', 'make_post_moderated', 'make_moderated']
  6.  
  7. def moderate(self, request, rows_updated, choice_description):
  8. if rows_updated == 1:
  9. message_bit = "1 запись помечена, как %s" % choice_description
  10. else:
  11. message_bit = "%s записей отмечены, как %s." % (rows_updated, choice_description)
  12. self.message_user(request, "%s" % message_bit)
  13.  
  14. def make_spam(self, request, queryset):
  15. self.moderate(
  16. request=request,
  17. rows_updated=queryset.update(moderation=PostBase.SPAM),
  18. choice_description="SPAM"
  19. )
  20. make_spam.short_description = "Отметить помеченные, как SPAM"
  21.  
  22. def make_not_moderated(self, request, queryset):
  23. self.moderate(
  24. request=request,
  25. rows_updated=queryset.update(moderation=PostBase.NOT_MODERATED),
  26. choice_description="NOT_MODERATED"
  27. )
  28. make_not_moderated.short_description = "Отметить помеченные, как NOT_MODERATED"
  29.  
  30. def make_post_moderated(self, request, queryset):
  31. self.moderate(
  32. request=request,
  33. rows_updated=queryset.update(moderation=PostBase.POST_MODERATED),
  34. choice_description="POST_MODERATED"
  35. )
  36. make_post_moderated.short_description = "Отметить помеченные, как POST_MODERATED"
  37.  
  38. def make_moderated(self, request, queryset):
  39. self.moderate(
  40. request=request,
  41. rows_updated=queryset.update(moderation=PostBase.MODERATED),
  42. choice_description="MODERATED"
  43. )
  44. make_moderated.short_description = "Отметить помеченные, как MODERATED"

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

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

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

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

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

Пікірлер

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

Qt - Тест 001. Сигналы и слоты

  • Нәтиже:84ұпай,
  • Бағалау ұпайлары4
Ua

Qt - Тест 001. Сигналы и слоты

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

Qt - Тест 001. Сигналы и слоты

  • Нәтиже:47ұпай,
  • Бағалау ұпайлары-6
Соңғы пікірлер
ИМ
Игорь МаксимовҚар. 22, 2024, 9:51 Т.Қ.
Django - Оқулық 017. Теңшелген Django кіру беті Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
Evgenii Legotckoi
Evgenii LegotckoiҚаз. 31, 2024, 11:37 Т.Қ.
Django - Сабақ 064. Python Markdown кеңейтімін қалай жазуға болады Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
A
ALO1ZEҚаз. 19, 2024, 5:19 Т.Қ.
Qt Creator көмегімен fb3 файл оқу құралы Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
ИМ
Игорь МаксимовҚаз. 5, 2024, 4:51 Т.Қ.
Django - Сабақ 064. Python Markdown кеңейтімін қалай жазуға болады Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas5Шілде 5, 2024, 8:02 Т.Қ.
QML - Сабақ 016. SQLite деректер қоры және онымен QML Qt-та жұмыс істеу Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
Енді форумда талқылаңыз
f
firstlunoxodАқп. 15, 2025, 1:46 Т.Қ.
Рисование на QGraphicsScene при зажатой кнопке мыши Подскажите, пожалуйста! Как данный класс можно дополнить, чтобы созданные объекты можно было перемещать мышкой по сцене?
Дмитрий
ДмитрийАқп. 3, 2025, 4:24 Т.Қ.
Создание deb-пакета. Как создать ярлык на рабочем столе после установки собственного deb-пакета? Всем привет. Сделал свой deb-пакет с программой. Всё устанавливается и работает. Ставлю по пути /usr/bin/my_application. Как для пользователя при установке пакета сразу создать ярлык на раб…
NW
Nayo WaiҚаң. 30, 2025, 7:22 Т.Қ.
не запускается компьютер!!! Не запускается компьютер (точнее работает блок , но сам монитор вообще жесть)В общем я ничего с интернета не скачивала в последнее время. На компе никаких левых пр…
n
nklyҚаң. 3, 2025, 12:52 Т.Қ.
Нужно запретить перемещение только некоторых итемов, остальные перемещать можно. Вопрос решен. Узнать QModelIndex элемента на который мы перетаскиваем другой элемент, можно с помощью функции indexAt(event->position().toPoint()) представления QTreeViev вызываемой в переопр…
M
MarselТам. 17, 2023, 12:26 Т.Ж.
OAuth2.0 через VK, получение email Спасибо большое за помощь и простите за то что отнял время своей невнимательностью.

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