2009-07-04 25 views
18

Tôi đã phân phối thành công tệp phương tiện cho các tệp MEDIA bình thường, nhưng khi tôi cố gắng phân phát tệp phương tiện quản trị, tôi đã thất bại. xin vui lòng giúp tôi xác định vị trí vấn đề, như tôi đã cố gắng để khắc phục sự cố trong vài giờ đã không có may mắn (được googling quá và đọc django doc về phục vụ các tập tin tĩnh là tốt).Django: phục vụ các tệp phương tiện ADMIN

Các lỗi như tôi đã cố gắng để truy cập vào localhost: 8000/media/a.gif là như sau:

Page not found: f:\python25\lib\site-packages\django/contrib/admin/media\a.gif

tôi đặt các tập tin quản trị truyền thông trong thư mục có tên là "phương tiện truyền thông", trong khi tôi đặt phương tiện truyền thông bình thường các tệp trong thư mục có tên là "tĩnh". Tôi cũng đang ở trên Windows.

Đây là cách tôi phục vụ các tập tin thông thường phương tiện truyền thông trong urls.py:

# serve static files 
from django.conf import settings 
if settings.ENVIRONMENT==settings.ENV_DEVELOPMENT: 
    urlpatterns += patterns("django.views", 
     url(r"%s(?P<path>.*)$" % settings.MEDIA_URL[1:], "static.serve", {"document_root": settings.MEDIA_ROOT,}) 
    ) 

Và settings.py của tôi (chỉ những phần quan trọng):

import project_path 
MEDIA_ROOT = project_path.MEDIA.replace('\\','/') 
MEDIA_URL = '/static/' 
ADMIN_MEDIA_PREFIX = '/media/' 
TEMPLATE_DIRS = (
    project_path.TEMPLATE.replace('\\','/'), 
) 

Và project_path.py tôi:

import sys 
from os.path import dirname, join 
ROOT = dirname(__file__) 
APP = join(ROOT, "apps") 
TEMPLATE = join(ROOT, "templates") 
MEDIA = join(ROOT, "static") 
ADMIN_MEDIA = join(ROOT, "media") 

Bất kỳ gợi ý nào?

hoặc có thể ít nhất là hãy chia sẻ làm thế nào để bạn phục vụ các tập tin media admin của bạn (mà không thay đổi bất kỳ tập tin từ máy chủ web, nhưng chỉ thông qua mã nguồn django)

Cảm ơn trước :)

+0

Bạn đã bao giờ giải quyết vấn đề này chưa? Tôi đang có một trải nghiệm tương tự khi làm việc trên Mac với Django 1.1, phục vụ các tệp phương tiện bình thường nhưng không dành cho quản trị viên ... – Danielb

+0

Lý do cài đặt url không hoạt động, là vì 'django/core/management/commands/runserver. py' cùng với 'django.core.servers.basehttp' thiết lập trình xử lý WSGI cho' ADMIN_MEDIA_PREFIX'. Nó xử lý yêu cầu trước khi URLconf được nhấn – vdboor

Trả lời

1

Thử thay đổi:

ADMIN_MEDIA_PREFIX = '/static/media/'

này giả định rằng bạn MEDIA_ROOT/media/thư mục chứa thư mục phương tiện truyền thông admin (đó là những gì tôi hiểu từ câu hỏi của bạn).

+0

cảm ơn câu trả lời, nhưng nó vẫn không hoạt động :) Tôi đã nhập http: // localhost: 8000/static/media/a.gif vào url của trình duyệt và kết quả là: Không tìm thấy trang: f: \ python25 \ lib \ site-packages \ django/contrib/admin/media \ a.gif –

+0

Tôi nghĩ tôi sẽ cố gắng tạo lại dự án từ đầu bằng cách sử dụng các ví dụ truyền thông quản trị thông thường :) cảm ơn cho câu trả lời –

2

Hãy thử

(r '^ admin_media /(.*)', 'django.views.static.serve', { 'DOCUMENT_ROOT': 'django/contrib/admin/media /', 'show_indexes' : True}),

trong tệp urls.py của bạn. Và thay đổi

ADMIN_MEDIA_PREFIX = '/admin_media/' 
+0

cảm ơn cho câu trả lời, nhưng nó vẫn không hoạt động :) Tôi gõ http: // localhost: 8000/admin_media/a.gif trong url broswer và kết quả là: Không tìm thấy trang: f: \ python25 \ lib \ site-packages \ django/contrib/admin/media \ a.gif –

2

Tôi vừa sửa lỗi tương tự trong trang web thử nghiệm của mình. ADMIN_MEDIA_PREFIX và MEDIA_URL không bao giờ nên được như vậy, xem lưu ý sau đây trong docs:

Make sure to use a trailing slash, and to have this be different from the MEDIA_URL setting (since the same URL cannot be mapped onto two different sets of files).

32

câu trả lời của bạn là trừ khi ADMIN_MEDIA_PREFIX đặt một cách rõ ràng miền lệnh runserver sẽ phục vụ các tập tin media quản trị từ contrib.admin.

Tôi cũng bị đốt cháy bởi hành vi này ma thuật. Đã có một vé cho điều này (Ticket #8336), nhưng quyết định thiết kế là để lại sự tiện lợi và nhầm lẫn như nó được.

Vì vậy, để phục vụ phương tiện truyền thông quản trị của bạn (sử dụng Grappelli hoặc bất cứ điều gì da admin bạn muốn sử dụng) từ thư mục của bạn với lệnh runserver bạn phải sử dụng một cái gì đó như:

MEDIA_ROOT = os.path.join(PROJECT_ROOT, 'media/') 
ADMIN_MEDIA_ROOT = os.path.join(PROJECT_ROOT, 'admin-media/') 
MEDIA_URL = '/site-media/' 
ADMIN_MEDIA_PREFIX = 'http:/localhost:8000/admin-media/' 

Tôi hy vọng tôi đang hồi sinh câu hỏi đúng ở đây. Xin lỗi trước.

+0

cảm ơn, tôi cũng bị cháy trên cái này – orwellian

+0

Hoàn hảo. Cám ơn vì cái này. –

+3

Hành vi tiện lợi ma thuật. Cảm ơn Django! Làm thế nào về mặc định hợp lý trong settings.py thay vào đó? (thở dài) ... cảm ơn vì Phoku này! – Rich

3

Nó được khuyên nên chạy máy chủ dev một chút khác nhau [1] python manage.py runserver mydomain.com:8000 --adminmedia =/path/to/your/admin/media/

[ 1] http://code.google.com/p/django-grappelli/wiki/Installation

+2

Đó phải là django-grappelli cụ thể. Với vanilla Django 1.2, tôi nhận được 'lỗi: không có tùy chọn như vậy: --adminmedia' –

+0

Không, giải thích là [ở đây] [1]:" Nếu ứng dụng đóng gói staticfiles được kích hoạt (mặc định trong các dự án mới) lệnh runserver sẽ overriden với một lệnh runerver của riêng mà không có tùy chọn --adminmedia do không dùng nữa. " [1]: https://docs.djangoproject.com/en/dev/ref/django-admin/ – eedeep

1

Vì các tệp tĩnh bao gồm trong thân cây, (khoảng 1,3 tôi tin), ma thuật ADMIN_MEDIA_PREFIX không còn được sử dụng nữa.

Hiện tại, máy chủ lưu trữ giả định STATIC_URL + 'quản trị viên /' của bạn. Nó bí mật và âm thầm chặn các yêu cầu của bạn, bỏ qua tất cả các urlconf của bạn, và cố gắng làm cho bạn phát điên.

+1

Tôi thấy điều ngược lại - với django 1.3 nếu tôi không có ADMIN_MEDIA_PREFIX = posixpath.join (STATIC_URL, "admin/") (nghĩa là, nếu tôi không có ADMIN_MEDIA_PREFIX ở tất cả) thì máy chủ lưu trữ đã không phân phát phương tiện quản trị của tôi một cách chính xác. – eedeep

0

Cố gắng sử dụng STATICFILES_DIRS như đòn

# Additional locations of static files 
STATICFILES_DIRS = (
    # Put strings here, like "/home/html/static" or "C:/www/django/static". 
    # Always use forward slashes, even on Windows. 
    # Don't forget to use absolute paths, not relative paths. 
    ("images", os.path.join(STATIC_ROOT,'images').replace('\\','/')), 
    ("css", os.path.join(STATIC_ROOT,'css').replace('\\','/')), 
    ("js",  os.path.join(STATIC_ROOT,'js').replace('\\','/')), 
) 

Có một goodluck!

+1

STATICFILES_DIRS = ( ("phương tiện", os.path.join (STATIC_ROOT, 'phương tiện'). Thay thế ('\\', '/')), ) – HUHU

Các vấn đề liên quan