- 1. PostBase
- 2. PostBaseAdmin
Сайтта рефакторингтен кейін төрт негізгі нысан анықталды, оларда ортақ қасиеттер анықталды, атап айтқанда:
- Мақалалар - Мақалалар
- Пікір - Түсініктемелер
- 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-сервері ұсынамын.