Đường dẫn mẫu Django


89

Tôi đang làm theo hướng dẫn về http://docs.djangoproject.com/en/dev/intro/tutorial02/#intro-tutorial02 trong môi trường Windows 7. Tệp cài đặt của tôi là:

TEMPLATE_DIRS = (
    'C:/django-project/myapp/mytemplates/admin'
)

Tôi lấy base_templatetừ mẫu admin/base_site.htmltừ trong thư mục mẫu quản trị Django mặc định trong mã nguồn của chính Django (django / Contrib / admin / Template) vào thư mục con quản trị của thư mục myapp như hướng dẫn đã hướng dẫn.

Nó dường như không ảnh hưởng vì một số lý do. Bất kỳ manh mối về những gì có thể là vấn đề? Tôi có phải thực hiện đồng bộ db không?

Câu trả lời:


183

Tôi biết điều này không có trong hướng dẫn Django và xấu hổ về chúng, nhưng tốt hơn là bạn nên thiết lập các đường dẫn tương đối cho các biến đường dẫn của bạn. Bạn có thể thiết lập nó như sau:

import os.path

PROJECT_PATH = os.path.realpath(os.path.dirname(__file__))

...

MEDIA_ROOT = os.path.join(PROJECT_PATH, 'media/')

TEMPLATE_DIRS = [
    os.path.join(PROJECT_PATH, 'templates/'),
]

Bằng cách này, bạn có thể di chuyển dự án Django của mình và gốc đường dẫn của bạn sẽ tự động cập nhật. Điều này rất hữu ích khi bạn thiết lập máy chủ sản xuất của mình.

Thứ hai, có điều gì đó đáng ngờ đối với đường dẫn TEMPLATE_DIRS của bạn. Nó sẽ trỏ đến thư mục gốc của thư mục mẫu của bạn. Ngoài ra, nó cũng nên kết thúc bằng một dấu vết /.

Ở đây tôi chỉ đoán rằng .../admin/thư mục không phải là thư mục gốc của bạn. Nếu bạn vẫn muốn viết đường dẫn tuyệt đối, bạn nên lấy tham chiếu đến thư mục mẫu quản trị.

TEMPLATE_DIRS = [
    'C:/django-project/myapp/mytemplates/',
]

Như đã nói, các trình tải mẫu theo mặc định phải được thiết lập để truy cập đệ quy vào thư mục ứng dụng của bạn để định vị các tệp mẫu.

TEMPLATE_LOADERS = [
    'django.template.loaders.filesystem.load_template_source',
    'django.template.loaders.app_directories.load_template_source',
    # 'django.template.loaders.eggs.load_template_source',
]

Bạn không cần phải sao chép qua các mẫu quản trị trừ khi bạn muốn ghi đè một cái gì đó.

Bạn sẽ phải chạy syncdb nếu bạn chưa chạy nó. Bạn cũng sẽ cần phải phục vụ tĩnh các tệp phương tiện của mình nếu bạn đang lưu trữ django thông qua máy chủ chạy.


1
cảm ơn đã xóa "/ admin" ở cuối đường dẫn tương đối TEMPLATE_DIRS đã làm được.
shaytac

1
Đề xuất này đặt thư mục mẫu bên trong thư mục dự án. Để tổ chức tốt hơn, thay vào đó, đặt nó vào bên trong thư mục của ứng dụng có hợp lý hơn không?
Sahas Katta

2
Điều này đã khắc phục sự cố của tôi. Cảm ơn. NHƯNG, tệp cài đặt mặc định có nhận xét với TEMPLATE_DIRS rằng, "Đừng quên sử dụng đường dẫn tuyệt đối, không phải đường dẫn tương đối". Có ai biết lý do cho nhận xét đó không?
bhekman

1
PROJECT_PATH là đường dẫn tuyệt đối của thư mục dự án. Phương thức này đặt động đường dẫn phương tiện tuyệt đối trong thời gian chạy để giá trị không được mã hóa cứng và có thể tự động thay đổi theo vị trí của dự án. Đây là một bài đăng cũ nhưng bạn có thể sử dụng nó để xác định vị trí của bất kỳ thư mục hoặc tệp nào trong dự án.
digitaldreamer

2
Tôi sẽ đề nghị sử dụng os.path.joinđể nối các đường dẫn vào dir cơ sở.
antonagestam

34

Nếu sử dụng cài đặt Django như đã được cài đặt, thì tại sao không chỉ sử dụng BASE_DIR và TEMPLATES tích hợp sẵn, được xác định trước của nó? Trong pip đã cài đặt Django (v1.8), tôi nhận được:

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 


TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [
            ### ADD YOUR DIRECTORY HERE LIKE SO:
            BASE_DIR + '/templates/',
        ],
        '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',
            ],
        },
    },
]

1
«BASE_DIR + '/ templates /',» này đã thực hiện một mẹo nhỏ. Và nó trông thanh lịch hơn, thay vì phần riêng biệt.
Maxiller

2
sử dụng os.path.join(BASE_DIR, 'templates')cho đường dẫn độc lập với nền tảng.
Abhyudai

11

Giải pháp thông minh trong Django 2.0.3 để giữ các mẫu trong thư mục dự án ( /root/templates/app_name):

settings.py

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
TEMP_DIR = os.path.join(BASE_DIR, 'templates')
...
TEMPLATES = [
{
    'BACKEND': 'django.template.backends.django.DjangoTemplates',
    'DIRS': [TEMP_DIR],
...

trong views.py chỉ cần thêm đường dẫn mẫu như vậy:

app_name/html_name

9

Đối với Django 1.6.6:

BASE_DIR = os.path.dirname(os.path.dirname(__file__))
TEMPLATE_DIRS = os.path.join(BASE_DIR, 'templates')

Cũng tĩnh và phương tiện cho chế độ gỡ lỗi và sản xuất:

STATIC_URL = '/static/'
MEDIA_URL = '/media/'
if DEBUG:
    STATIC_ROOT = os.path.join(BASE_DIR, 'static')
    MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
else:
    STATIC_ROOT = %REAL_PATH_TO_PRODUCTION_STATIC_FOLDER%
    MEDIA_ROOT = %REAL_PATH_TO_PRODUCTION_MEDIA_FOLDER%

Vào urls.py bạn phải thêm:

from django.conf.urls import patterns, include, url
from django.contrib import admin
from django.conf.urls.static import static
from django.conf import settings

from news.views import Index

admin.autodiscover()

urlpatterns = patterns('',
    url(r'^admin/', include(admin.site.urls)),
    ...
    )

urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

Trong Django 1.8, bạn có thể đặt đường dẫn mẫu, phần phụ trợ và các tham số khác cho các mẫu trong một từ điển ( settings.py ):

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [
            path.join(BASE_DIR, 'templates')
        ],
        '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',
            ],
        },
    },
]

Tài liệu chính thức.


Nhu cầu đường Template là một tuple: sử dụng TEMPLATE_DIRS này = (os.path.join (BASE_DIR, 'mẫu'),)
renderbox

6

Tôi cũng gặp sự cố với phần này của hướng dẫn (hướng dẫn được sử dụng cho phiên bản 1.7).

Sai lầm của tôi là tôi chỉ chỉnh sửa chuỗi 'Quản trị Django' và không chú ý đến hướng dẫn sử dụng.

Đây là dòng từ django / Contrib / admin / Template / admin / base_site.html :

<h1 id="site-name"><a href="{% url 'admin:index' %}">{{ site_header|default:_('Django administration') }}</a></h1>

Nhưng sau một thời gian và thất vọng, rõ ràng là có câu lệnh 'site_header hoặc default: _' cần được xóa. Vì vậy, sau khi loại bỏ câu lệnh (như ví dụ trong sách hướng dẫn mọi thứ đã hoạt động như mong đợi).

Hướng dẫn sử dụng ví dụ:

<h1 id="site-name"><a href="{% url 'admin:index' %}">Polls Administration</a></h1>

2

Được rồi 😁 Giả sử bạn có một dự án hoàn toàn mới, nếu vậy, bạn sẽ truy cập vào settings.pyhồ sơ và tìm kiếm TEMPLATESsau khi tìm thấy nó, bạn chỉ cần dán dòng này os.path.join(BASE_DIR, 'template')vào 'DIRS'Cuối cùng, bạn sẽ nhận được những thứ như sau:

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [
            os.path.join(BASE_DIR, 'template')
        ],
        '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',
            ],
        },
    },
]

Nếu bạn muốn biết thư mục BASE_DIR của mình nằm ở đâu, hãy gõ 3 lệnh đơn giản sau:

python3 manage.py shell

Khi bạn đã ở trong shell:

>>> from django.conf import settings
>>> settings.BASE_DIR

Tái bút: Nếu bạn đặt tên thư mục mẫu của mình bằng một tên khác, bạn cũng sẽ thay đổi nó ở đây.


2

Trong django 3.1, chuyển đến cài đặt dự án của bạn và nhập hệ điều hành

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, "templates")],
        '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',
            ],
        },
    },
]


0

về cơ bản BASE_DIRlà thư mục dự án django của bạn, cùng dir ở đâu manage.py.

    TEMPLATES = [
        {
            'BACKEND': 'django.template.backends.django.DjangoTemplates',
            'DIRS': [os.path.join(BASE_DIR, 'templates')],
            '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',
                ],
            },
        },
    ]

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.