ระบบควบคุมในการกระจายและเข้าถึงข่าวสาร การประกาศ

วันจันทร์ที่ 15 กุมภาพันธ์ พ.ศ. 2559

django cms #8 Namesapced Apphooks

ไม่มีความคิดเห็น :
  คือการตั้งค่า Namespace สำหรับ Apphook โดยที่เราใช้หลาย instant ที่ใช้งาน app เดียวกันในคนละ page กัน หลักการคือเราทำงานอยู่ใน page ไหน การตั้งค่าต่างๆก็จะมีผลกับ page นั้น เช่น เราเขียนกระดาษแผ่นหนึ่งเราเขียนด้านหน้ากับเขียนด้านหลังมันก็จะมีเฉพาะกับด้านนั้นๆโดยที่เป็นกระดาษแผ่นเดียวกัน ไม่ใช่ว่าเราเขียนกระดาษด้านหน้าแล้วจะไปมีผลกับด้านหลัง

ขั้นตอนการสร้างเป็นดังนี้
  สร้าง app โดยใช้คำสั่ง python manage.py startapp faq

  เข้าไปในไดเรกทอรี fag สร้างไฟล์ models.py ดังนี้ 

from aldryn_apphooks_config.fields import AppHookConfigField
from aldryn_apphooks_config.managers import AppHookConfigManager
from django.db import models
from faq.cms_appconfig import FaqConfig


class Entry(models.Model):
    app_config = AppHookConfigField(FaqConfig)
    question = models.TextField(blank=True, default='')
    answer = models.TextField()

    objects = AppHookConfigManager()

    def __unicode__(self):
        return self.question

    class Meta:
        verbose_name_plural = 'entries'

  ในไดเรกทอรีเดิม สร้างไฟล์ cms_appcinfig.py ดังนี้

from aldryn_apphooks_config.models import AppHookConfig
from aldryn_apphooks_config.utils import setup_config
from app_data import AppDataForm
from django.db import models
from django import forms
from django.utils.translation import ugettext_lazy as _


class FaqConfig(AppHookConfig):
    paginate_by = models.PositiveIntegerField(
        _('Paginate size'),
        blank=False,
        default=5,
    )


class FaqConfigForm(AppDataForm):
    title = forms.CharField()
setup_config(FaqConfigForm, FaqConfig)

  เข้าไปใน admin.py แล้วแก้ไขโค้ดเป็นดังนี้

from django.contrib import admin
from .cms_appconfig import FaqConfig
from .models import Entry
from aldryn_apphooks_config.admin import ModelAppHookConfig, BaseAppHookConfig


class EntryAdmin(ModelAppHookConfig, admin.ModelAdmin):
    list_display = (
        'question',
        'answer',
        'app_config',
    )
    list_filter = (
        'app_config',
    )
admin.site.register(Entry, EntryAdmin)


class FaqConfigAdmin(BaseAppHookConfig, admin.ModelAdmin):
    def get_config_fields(self):
        return (
            'paginate_by',
            'config.title',
        )
admin.site.register(FaqConfig, FaqConfigAdmin)

  สร้างไฟล์ cms_apps.py

from aldryn_apphooks_config.app_base import CMSConfigApp
from cms.apphook_pool import apphook_pool
from django.utils.translation import ugettext_lazy as _
from .cms_appconfig import FaqConfig


class FaqApp(CMSConfigApp):
    name = _("Faq App")
    urls = ["faq.urls"]
    app_name = "faq"
    app_config = FaqConfig

apphook_pool.register(FaqApp)

  แก้ไขไฟล์ views.py ดังนี้

from aldryn_apphooks_config.mixins import AppConfigMixin
from django.views import generic
from .models import Entry


class IndexView(AppConfigMixin, generic.ListView):
    model = Entry
    template_name = 'faq/index.html'

    def get_queryset(self):
        qs = super(IndexView, self).get_queryset()
        return qs.namespace(self.namespace)

    def get_paginate_by(self, queryset):
        try:
            return self.config.paginate_by
        except AttributeError:
            return 10

  สร้างไดเรกทอรี templates/faq แล้วสร้างไฟล์ index.html ดังนี้

{% extends 'base.html' %}

{% block content %}
    <h1>{{ view.config.title }}</h1>
    <p>Namespace: {{ view.namespace }}</p>
    <dl>
        {% for entry in object_list %}
            <dt>{{ entry.question }}</dt>
            <dd>{{ entry.answer }}</dd>
        {% endfor %}
    </dl>

    {% if is_paginated %}
        <div class="pagination">
            <span class="step-links">
                {% if page_obj.has_previous %}
                    <a href="?page={{ page_obj.previous_page_number }}">previous</a>
                {% else %}
                    previous
                {% endif %}

                <span class="current">
                    Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}.
                </span>

                {% if page_obj.has_next %}
                    <a href="?page={{ page_obj.next_page_number }}">next</a>
                {% else %}
                    next
                {% endif %}
            </span>
        </div>
    {% endif %}
{% endblock %}

  สร้างไฟล์ urls.py ดังนี้

from django.conf.urls import patterns, url
from . import views


urlpatterns = patterns('',
    url(r'^$', views.IndexView.as_view(), name='index'),
)

  เพิ่ม faq ใน INSTALLED_APPS แล้วใช้คำสั่ง

 python manage.py makemigrations faq
 python manage.py migrate faq

 ทดลองสร้าง page 2 หน้าแล้วตั้งค่า namespace ที่แตกต่างกัน (อย่าลืม publish page ด้วย)ได้ผลดังนี้




เข้า Advanced setting เลือกใช้ faq app แล้วกดเพิ่ม Namesapce (กดเครื่องหมาย +) แล้วใส่ค่าที่ต้องการลงไป

ค่า INSTANCE NAMESPACE และ TITLE ที่เราเขียนไว้ จะปรากฏขึ้นมา





 

ไม่มีความคิดเห็น :

แสดงความคิดเห็น