จะลบล้างและขยายเทมเพลตผู้ดูแลระบบ Django พื้นฐานได้อย่างไร


126

ฉันจะลบล้างเทมเพลตผู้ดูแลระบบ (เช่น admin / index.html) ได้อย่างไรในขณะเดียวกันก็ขยาย (ดูhttps://docs.djangoproject.com/en/dev/ref/contrib/admin/#overriding-vs-replacing -an-admin-template )?

อันดับแรก - ฉันรู้ว่ามีการถามและตอบคำถามนี้มาก่อนแล้ว (ดูDjango: การแทนที่และการขยายเทมเพลตแอป ) แต่เนื่องจากคำตอบบอกว่าไม่สามารถใช้ได้โดยตรงหากคุณใช้ตัวโหลดเทมเพลต app_directories (ซึ่งส่วนใหญ่เป็น เวลา).

วิธีแก้ปัญหาปัจจุบันของฉันคือทำสำเนาและขยายจากสิ่งเหล่านี้แทนที่จะขยายโดยตรงจากเทมเพลตผู้ดูแลระบบ วิธีนี้ใช้งานได้ดี แต่สับสนมากและเพิ่มงานพิเศษเมื่อเทมเพลตผู้ดูแลระบบเปลี่ยนไป

อาจนึกถึงแท็กส่วนขยายที่กำหนดเองสำหรับเทมเพลต แต่ฉันไม่ต้องการสร้างวงล้อใหม่หากมีวิธีแก้ไขอยู่แล้ว

หมายเหตุด้านข้าง: มีใครรู้บ้างว่าปัญหานี้จะได้รับการแก้ไขโดย Django เองหรือไม่?


1
การคัดลอกเทมเพลตผู้ดูแลระบบการขยายและการลบล้าง / การเพิ่มบล็อกนั้นมีประสิทธิภาพมากที่สุดแม้ว่าจะไม่ใช่ขั้นตอนการทำงานที่ดีที่สุดเนื่องจากสถานะปัจจุบันของ Django ฉันไม่เห็นวิธีอื่นใดที่จะทำในสิ่งที่คุณพยายามทำในสามปีของการทำงานกับมัน :)
แบรนดอน

ดี - ฉันไม่รู้ว่านี่เป็นสิ่งที่ดีหรือไม่ แต่อย่างน้อยคนอย่างคุณก็ได้ข้อสรุปเหมือนกัน นั่นเป็นเรื่องดีที่จะได้ยิน :)
Semmel

คำตอบ:


101

อัปเดต :

อ่านเอกสารสำหรับ Django เวอร์ชันของคุณ เช่น

https://docs.djangoproject.com/en/1.11/ref/contrib/admin/#admin-overriding-templates https://docs.djangoproject.com/en/2.0/ref/contrib/admin/#admin-overriding -templates

คำตอบเดิมจากปี 2554:

ฉันมีปัญหาเดียวกันเมื่อประมาณหนึ่งปีครึ่งที่แล้วและฉันพบตัวโหลดเทมเพลตที่ดีใน djangosnippets.orgซึ่งทำให้เรื่องนี้ง่ายขึ้น ช่วยให้คุณสามารถขยายเทมเพลตในแอปเฉพาะทำให้คุณสามารถสร้างadmin / index.htmlของคุณเองที่ขยายเทมเพลต admin / index.html จากแอปผู้ดูแลระบบ แบบนี้:

{% extends "admin:admin/index.html" %}

{% block sidebar %}
    {{block.super}}
    <div>
        <h1>Extra links</h1>
        <a href="https://stackoverflow.com/admin/extra/">My extra link</a>
    </div>
{% endblock %}

ฉันได้ให้ตัวอย่างทั้งหมดเกี่ยวกับวิธีใช้ตัวโหลดเทมเพลตนี้ในบล็อกโพสต์บนเว็บไซต์ของฉัน


18
สำหรับการอ้างอิง; ตัวอย่างข้อมูลในคำถามที่ได้รับการแปลงเป็น app Django และสามารถใช้ได้ใน PyPi (pip / easy_install) เป็น Django-apptemplates: pypi.python.org/pypi/django-apptemplates
Romløk

9
เพื่อให้ชัดเจน 100%: โซลูชันข้างต้นจะไม่ทำงานอีกต่อไปสำหรับ Django เวอร์ชันล่าสุด (อย่างน้อย 1.4) เนื่องจากฟังก์ชันใดฟังก์ชันหนึ่งที่สคริปต์ใช้จะคิดค่าเสื่อมราคา คุณสามารถค้นหาแหล่งข้อมูลที่อัปเดตได้ที่นี่
OldTinfoil

2
โปรดทราบว่าด้วย Django 1.8 สิ่งนี้จะยังคงใช้งานได้ แต่ต้องทำการตั้งค่าด้วยวิธีพิเศษ (ดูapp_namespace การตั้งค่าตัวโหลดเป็นตัวอย่าง) django-app-namespace-template-loaderเป็นทางเลือกที่ใช้งานได้django-apptemplatesหากอาจหยุดทำงานในวันหนึ่ง
Peterino

คำตอบนี้ดีมากสำหรับ Django เวอร์ชันเก่า แต่ ณ ตอนนี้คำตอบอื่นของ Cheng มีความเกี่ยวข้องมากกว่า stackoverflow.com/a/29997719/7344164
SoftwareEnggUmar

70

สำหรับ Django 1.8 เป็นรุ่นปัจจุบันคุณไม่จำเป็นต้อง symlink คัดลอกผู้ดูแลระบบ / เทมเพลตไปยังโฟลเดอร์โครงการของคุณหรือติดตั้งมิดเดิลแวร์ตามคำตอบด้านบน สิ่งที่ต้องทำมีดังนี้

  1. สร้างโครงสร้างต้นไม้ต่อไปนี้ (แนะนำโดยเอกสารอย่างเป็นทางการ )

    your_project
         |-- your_project/
         |-- myapp/
         |-- templates/
              |-- admin/
                  |-- myapp/
                      |-- change_form.html  <- do not misspell this

หมายเหตุ : ตำแหน่งของไฟล์นี้ไม่สำคัญ คุณสามารถวางไว้ในแอปของคุณและจะยังใช้งานได้ ตราบใดที่ django สามารถค้นพบตำแหน่งของมันได้ สิ่งที่สำคัญกว่านั้นคือชื่อของไฟล์ HTML จะต้องเหมือนกับชื่อไฟล์ HTML ดั้งเดิมที่ django ให้มา

  1. เพิ่มเส้นทางเทมเพลตนี้ในsettings.pyของคุณ:

    TEMPLATES = [
        {
            'BACKEND': 'django.template.backends.django.DjangoTemplates',
            'DIRS': [os.path.join(BASE_DIR, 'templates')], # <- add this line
            'APP_DIRS': True,
            'OPTIONS': {
                'context_processors': [
                    'django.template.context_processors.debug',
                    'django.template.context_processors.request',
                    'django.contrib.auth.context_processors.auth',
                    'django.contrib.messages.context_processors.messages',
                ],
            },
        },
    ]
  2. ระบุชื่อและบล็อกที่คุณต้องการลบล้าง ทำได้โดยดูในไดเรกทอรี admin / template ของ django ฉันใช้ Virtualenv ดังนั้นสำหรับฉันเส้นทางอยู่ที่นี่:

    ~/.virtualenvs/edge/lib/python2.7/site-packages/django/contrib/admin/templates/admin

ในตัวอย่างนี้ฉันต้องการแก้ไขแบบฟอร์มเพิ่มผู้ใช้ใหม่ responsiblve แม่แบบสำหรับมุมมองนี้เป็นchange_form.html เปิด change_form.html และค้นหา {% block%} ที่คุณต้องการขยาย

  1. ในchange_form.html ของคุณให้เขียนข้อความดังนี้:

    {% extends "admin/change_form.html" %}
    {% block field_sets %}
         {# your modification here #}
    {% endblock %}
  2. โหลดหน้าของคุณและคุณจะเห็นการเปลี่ยนแปลง


ยังไม่เพียงพอสำหรับการขยายเทมเพลต "index.html" หลักโดยไม่ต้องคัดลอกบล็อกทั้งหมด วิธีการแก้ปัญหาคือการเขียนบางอย่าง../ที่ "exetends" {% extends "../../admin/templates/admin/index.html" %}เส้นทางและเพื่อระบุเส้นทางเดิมซ้ำกันมากขึ้น ลิงค์สำหรับคำตอบ
hynekcer

1
ฉันคิดว่าใน TEMPLATES เราควรใช้ 'DIRS': [os.path.join (BASE_DIR, 'template')],
Raul Reyes

นี่คือประเภทของเธรดที่แสดงให้เห็นถึงข้อบกพร่องใน SO เฟรมเวิร์กได้รับการอัปเดตและคำถามไม่เกี่ยวข้องอีกต่อไปในความเป็นจริงมันเป็นการขัดขวางจากเส้นทางที่เหมาะสม คำตอบที่ดีที่นี่ เด็ก RTFM
Derek Adair

ขอบคุณสำหรับคำตอบนี้ ยกเว้น "ตำแหน่งของไฟล์นี้ไม่สำคัญ" ทุกอย่างทำงานได้ดี
Jaswanth Manigundan

54

หากคุณต้องการเขียนทับadmin/index.htmlคุณสามารถตั้งค่าพารามิเตอร์index_templateของAdminSite.

เช่น

# urls.py
...
from django.contrib import admin

admin.site.index_template = 'admin/my_custom_index.html'
admin.autodiscover()

และวางแม่แบบของคุณ <appname>/templates/admin/my_custom_index.html


5
ยอดเยี่ยม! การทำเช่นนี้ช่วยให้คุณสามารถทำได้{% extends "admin/index.html" %}จาก my_custom_index.html และมีการอ้างอิงเทมเพลตผู้ดูแลระบบ django โดยไม่ต้องคัดลอก ขอบคุณ.
mattmc3

3
@Semmel ควรทำเครื่องหมายว่านี่เป็นคำตอบที่ถูกต้องเนื่องจากเป็นแนวทางที่ง่ายที่สุดที่ใช้คุณสมบัติ django ในตัวและไม่จำเป็นต้องใช้ตัวโหลดเทมเพลตแบบกำหนดเอง
MrColes

17

ด้วยdjango1.5 (อย่างน้อย) คุณสามารถกำหนดเทมเพลตที่คุณต้องการใช้สำหรับรายการใดรายการหนึ่งได้modeladmin

ดูhttps://docs.djangoproject.com/en/1.5/ref/contrib/admin/#custom-template-options

คุณสามารถทำสิ่งที่ชอบ

class Myadmin(admin.ModelAdmin):
    change_form_template = 'change_form.htm'

ด้วยchange_form.htmlการเป็นเทมเพลต html แบบง่ายที่ขยายadmin/change_form.html(หรือไม่ถ้าคุณต้องการทำตั้งแต่เริ่มต้น)


9

คำตอบของ Chengs นั้นถูกต้องอย่างไรก็ตามตามเอกสารของผู้ดูแลระบบไม่สามารถเขียนทับเทมเพลตผู้ดูแลระบบทุกรายการได้ด้วยวิธีนี้: https://docs.djangoproject.com/en/1.9/ref/contrib/admin/#overriding-admin-templates

เทมเพลตที่อาจถูกแทนที่ต่อแอปหรือรุ่น

ไม่ใช่ทุกเทมเพลตในผู้มีส่วนร่วม / ผู้ดูแลระบบ / แม่แบบ / ผู้ดูแลระบบอาจถูกแทนที่ต่อแอปหรือต่อรุ่น สิ่งต่อไปนี้สามารถ:

app_index.html
change_form.html
change_list.html
delete_confirmation.html
object_history.html

สำหรับเทมเพลตที่ไม่สามารถลบล้างได้ด้วยวิธีนี้คุณยังสามารถลบล้างเทมเพลตเหล่านี้สำหรับทั้งโครงการได้ เพียงวางเวอร์ชันใหม่ในเทมเพลต /ไดเรกทอรีผู้ดูแลระบบของคุณ สิ่งนี้มีประโยชน์อย่างยิ่งในการสร้างหน้าเว็บ 404 และ 500 แบบกำหนดเอง

ฉันต้องเขียนทับ login.html ของผู้ดูแลระบบดังนั้นจึงต้องใส่เทมเพลตที่เขียนทับในโครงสร้างโฟลเดอร์นี้:

your_project
 |-- your_project/
 |-- myapp/
 |-- templates/
      |-- admin/
          |-- login.html  <- do not misspell this

(โดยไม่มีโฟลเดอร์ย่อย myapp ในผู้ดูแลระบบ) ฉันไม่มีคำตำหนิเพียงพอสำหรับการแสดงความคิดเห็นในโพสต์ของ Cheng นี่คือเหตุผลที่ฉันต้องเขียนสิ่งนี้เป็นคำตอบใหม่


ขอบคุณสำหรับคำติชมที่ไม่พึงประสงค์ฉันหวังว่าคำตอบของฉันจะชัดเจนและตรงประเด็นมากขึ้นในตอนนี้
matyas

ใช่เป็นประโยชน์ที่จะทราบว่าแม่แบบสามารถปรับแต่งในระดับโปรเจ็กต์ได้แม้ว่าบางส่วนจะสามารถเปลี่ยนแปลงได้ในระดับแอปพลิเคชันก็ตาม
hynekcer

5

วิธีที่ดีที่สุดคือใส่เทมเพลตผู้ดูแลระบบ Django ไว้ในโปรเจ็กต์ของคุณ ดังนั้นแม่ของคุณจะเป็นในtemplates/adminขณะที่หุ้นแม่ Django template/django_adminผู้ดูแลระบบจะอยู่ในการพูด จากนั้นคุณสามารถทำสิ่งต่อไปนี้:

แม่แบบ / ธุรการ / change_form.html

{% extends 'django_admin/change_form.html' %}

Your stuff here

หากคุณกังวลเกี่ยวกับการอัปเดตเทมเพลตสต็อกให้เป็นปัจจุบันคุณสามารถรวมเทมเพลตเหล่านี้ไว้กับ svn externals หรือที่คล้ายกัน


การใช้ svn externals เป็นความคิดที่ดี ปัญหาที่เกิดขึ้นคือนักแปลของฉันทุกคนจะแปลเทมเพลตเหล่านั้นทั้งหมด (เนื่องจาก makemessages จะรวบรวมสตริงการแปลจากเทมเพลตผู้ดูแลระบบทั้งหมด) ซึ่งจะเพิ่มงานพิเศษมากมายหากคุณทำงานกับหลายภาษา อาจมีวิธียกเว้นเทมเพลตเหล่านั้นจาก makemessages หรือไม่?
Semmel

ใช้--ignoreอาร์กิวเมนต์กับmakemessages. ดู: docs.djangoproject.com/en/dev/ref/django-admin/#makemessages
Chris Pratt

ฉันคิดว่าคำตอบอื่นตรงกับความต้องการของฉันดีกว่า แต่ฉันชอบโซลูชันของคุณและคิดว่าเป็นทางเลือกที่ดีหากคุณไม่ต้องการยุ่งวุ่นวายกับตัวโหลดเทมเพลตของคุณ
Semmel

5

ฉันไม่พบคำตอบเดียวหรือส่วนหนึ่งในเอกสาร Django อย่างเป็นทางการที่มีข้อมูลทั้งหมดที่ฉันต้องการเพื่อแทนที่ / ขยายเทมเพลตผู้ดูแลระบบเริ่มต้นดังนั้นฉันจึงเขียนคำตอบนี้เพื่อเป็นแนวทางที่สมบูรณ์โดยหวังว่าจะเป็นประโยชน์ สำหรับคนอื่น ๆ ในอนาคต

สมมติว่าโครงสร้างโครงการ Django มาตรฐาน:

mysite-container/         # project container directory
    manage.py
    mysite/               # project package
        __init__.py
        admin.py
        apps.py
        settings.py
        urls.py
        wsgi.py
    app1/
    app2/
    ...
    static/
    templates/

นี่คือสิ่งที่คุณต้องทำ:

  1. ในmysite/admin.pyสร้างคลาสย่อยของAdminSite:

    from django.contrib.admin import AdminSite
    
    
    class CustomAdminSite(AdminSite):
        # set values for `site_header`, `site_title`, `index_title` etc.
        site_header = 'Custom Admin Site'
        ...
    
        # extend / override admin views, such as `index()`
        def index(self, request, extra_context=None):
            extra_context = extra_context or {}
    
            # do whatever you want to do and save the values in `extra_context`
            extra_context['world'] = 'Earth'
    
            return super(CustomAdminSite, self).index(request, extra_context)
    
    
    custom_admin_site = CustomAdminSite()

    อย่าลืมนำเข้าแอcustom_admin_siteadmin.pyของคุณและลงทะเบียนโมเดลของคุณเพื่อแสดงบนไซต์ผู้ดูแลระบบที่คุณกำหนดเอง (ถ้าคุณต้องการ)

  2. ในmysite/apps.pyสร้างคลาสย่อยAdminConfigและตั้งค่าdefault_siteเป็นadmin.CustomAdminSiteจากขั้นตอนก่อนหน้า:

    from django.contrib.admin.apps import AdminConfig
    
    
    class CustomAdminConfig(AdminConfig):
        default_site = 'admin.CustomAdminSite'
  3. ในmysite/settings.pyแทนที่django.admin.siteในINSTALLED_APPSด้วยapps.CustomAdminConfig(ที่กำหนดเองการตั้งค่าแอปผู้ดูแลระบบของคุณจากขั้นตอนก่อนหน้า)

  4. ในmysite/urls.pyแทนที่admin.site.urlsจาก URL ของผู้ดูแลระบบเป็นcustom_admin_site.urls

    from .admin import custom_admin_site
    
    
    urlpatterns = [
        ...
        path('admin/', custom_admin_site.urls),
        # for Django 1.x versions: url(r'^admin/', include(custom_admin_site.urls)),
        ...
    ]
  5. สร้างแม่แบบที่คุณต้องการที่จะแก้ไขในของคุณtemplatesไดเรกทอรีการบำรุงรักษาโครงสร้างผู้ดูแลระบบแม่ไดเรกทอรีเริ่มต้น Django ตามที่ระบุไว้ในเอกสาร ตัวอย่างเช่นถ้าคุณกำลังปรับเปลี่ยนสร้างไฟล์admin/index.htmltemplates/admin/index.html

    ทั้งหมดของแม่ที่มีอยู่สามารถแก้ไขได้ด้วยวิธีนี้และชื่อและโครงสร้างของพวกเขาสามารถพบได้ในรหัสที่มาของ Django

  6. ตอนนี้คุณสามารถลบล้างเทมเพลตได้โดยการเขียนตั้งแต่เริ่มต้นหรือขยายจากนั้นจึงแทนที่ / ขยายบล็อกเฉพาะ

    ตัวอย่างเช่นหากคุณต้องการให้ทุกอย่างเหมือนเดิม แต่ต้องการลบล้างการcontentบล็อก (ซึ่งในหน้าดัชนีจะแสดงรายการแอปและรุ่นของแอปที่คุณลงทะเบียนไว้) ให้เพิ่มสิ่งต่อไปนี้ในtemplates/admin/index.html:

    {% extends 'admin/index.html' %}
    
    {% block content %}
      <h1>
        Hello, {{ world }}!
      </h1>
    {% endblock %}

    ในการรักษาเนื้อหาดั้งเดิมของบล็อกให้เพิ่ม{{ block.super }}ทุกที่ที่คุณต้องการให้แสดงเนื้อหาต้นฉบับ:

    {% extends 'admin/index.html' %}
    
    {% block content %}
      <h1>
        Hello, {{ world }}!
      </h1>
      {{ block.super }}
    {% endblock %}

    คุณยังสามารถเพิ่มสไตล์และสคริปต์แบบกำหนดเองได้โดยการแก้ไขextrastyleและextraheadบล็อก


คุณมีแหล่งที่มาหรือเอกสารเกี่ยวกับเรื่องนี้หรือไม่?
แมรี่

นอกเหนือจากการอ้างอิงสองรายการที่ฉันได้เพิ่มในข้อ 5 ไม่ฉันไม่มีอะไรอื่นเลย
Faheel

1

ฉันเห็นด้วยกับ Chris Pratt แต่ฉันคิดว่าเป็นการดีกว่าที่จะสร้าง symlink ไปยังโฟลเดอร์ Django ดั้งเดิมที่เทมเพลตผู้ดูแลระบบวางไว้ใน:

ln -s /usr/local/lib/python2.7/dist-packages/django/contrib/admin/templates/admin/ templates/django_admin

และอย่างที่คุณเห็นมันขึ้นอยู่กับเวอร์ชันของ python และโฟลเดอร์ที่ติดตั้ง Django ดังนั้นในอนาคตหรือบนเซิร์ฟเวอร์ที่ใช้งานจริงคุณอาจต้องเปลี่ยนเส้นทาง


0

ไซต์นี้มีโซลูชันง่ายๆที่ใช้ได้กับการกำหนดค่า Django 1.7 ของฉัน

FIRST:สร้าง symlink ชื่อadmin_srcในเทมเพลต / ไดเร็กทอรีของโปรเจ็กต์ของคุณไปยังเทมเพลต Django ที่คุณติดตั้งไว้ สำหรับฉันใน Dreamhost โดยใช้ Virtualenv เทมเพลตผู้ดูแลระบบ Django "ต้นทาง" ของฉันอยู่ใน:

~/virtualenvs/mydomain/lib/python2.7/site-packages/django/contrib/admin/templates/admin

วินาที:สร้างไดเรกทอรีผู้ดูแลระบบในเทมเพลต /

ตอนนี้เทมเพลต / ไดเร็กทอรีของโครงการของฉันมีลักษณะดังนี้:

/templates/
   admin
   admin_src -> [to django source]
   base.html
   index.html
   sitemap.xml
   etc...

ที่สาม:ในเทมเพลต / admin / ไดเร็กทอรีใหม่ของคุณให้สร้างไฟล์base.html ที่มีเนื้อหานี้:

{% extends "admin_src/base.html" %}

{% block extrahead %}
<link rel='shortcut icon' href='{{ STATIC_URL }}img/favicon-admin.ico' />
{% endblock %}

FOURTH:เพิ่มผู้ดูแลระบบ favicon-admin.ico ลงในโฟลเดอร์ img root แบบคงที่ของคุณ

เสร็จสิ้น ง่าย.


0

สำหรับดัชนีแอปให้เพิ่มบรรทัดนี้ลงในไฟล์ py ทั่วไปเช่น url.py

admin.site.index_template = 'admin/custom_index.html'

สำหรับดัชนีโมดูลแอป: เพิ่มบรรทัดนี้ใน admin.py

admin.AdminSite.app_index_template = "servers/servers-home.html"

สำหรับรายการเปลี่ยนแปลง: เพิ่มบรรทัดนี้ในคลาสผู้ดูแลระบบ:

change_list_template = "servers/servers_changelist.html"

สำหรับเทมเพลตฟอร์มโมดูลแอป: เพิ่มบรรทัดนี้ในคลาสผู้ดูแลระบบของคุณ

change_form_template = "servers/server_changeform.html"

ฯลฯ และค้นหาอื่น ๆ ในคลาสโมดูลของผู้ดูแลระบบเดียวกัน


-1

คุณสามารถใช้django-Overextendsซึ่งให้การสืบทอดเทมเพลตแบบวงกลมสำหรับ Django

มันมาจากMezzanine CMS ซึ่ง Stephen ดึงมันออกมาเป็นส่วนขยาย Django แบบสแตนด์อโลน

ข้อมูลเพิ่มเติมที่คุณพบใน "Overriding vs Extending Templates" (http: /mezzanine.jupo.org/docs/content-architecture.html#overriding-vs-extending-templates) ภายในเอกสาร Mezzanine

หากต้องการข้อมูลเชิงลึกให้ดูที่ Stephens Blog "Circular Template Inheritance for Django" (http: /blog.jupo.org/2012/05/17/circular-template-inheritance-for-django)

และใน Google Groups การสนทนา (https: /groups.google.com/forum / #! topic / mezzanine-users / sUydcf_IZkQ) ซึ่งเป็นจุดเริ่มต้นของการพัฒนาคุณลักษณะนี้

บันทึก:

ฉันไม่มีชื่อเสียงในการเพิ่มลิงก์มากกว่า 2 ลิงก์ แต่ฉันคิดว่าลิงก์ให้ข้อมูลเบื้องหลังที่น่าสนใจ ดังนั้นฉันจึงทิ้งเครื่องหมายทับไว้หลัง "http (s):" บางทีคนที่มีชื่อเสียงดีกว่าสามารถซ่อมแซมลิงก์และลบบันทึกนี้ได้


ตั้งแต่ Django 1.9 โครงการนี้ไม่ได้รับการที่เกี่ยวข้องดูแลเพียงแค่ไม่ได้โฆษณาให้ดูcode.djangoproject.com/ticket/15053และgithub.com/stephenmcd/django-overextends/pull/37 ในการควบคุมอย่างสมบูรณ์ว่าจะโหลดเทมเพลตจากแอปใดมี django-apptemplates และ django-app-namespace-template-loader ซึ่งทั้งคู่ยังคงมีความเกี่ยวข้องหากคุณต้องการขยายจากแอปหนึ่งไปยังอีกแอปหนึ่ง
benjaoming
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.