วันจันทร์ที่ 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 ที่เราเขียนไว้ จะปรากฏขึ้นมา
สมัครสมาชิก:
ส่งความคิดเห็น
(
Atom
)


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