Ghi đè quản trị viên css trong django


83

Tôi muốn thay đổi một số css nhất định trong django quản trị như base.css. Thay đổi trực tiếp trong thư viện django có tốt hơn không? Làm cách nào để ghi đè nó theo cách tốt nhất?


Có lẽ Grappelli sẽ tiết kiệm cho bạn bận tâm ... grappelliproject.com cũ và hết hạn ... lincolnloop.com/blog/...
John Mee

Câu trả lời:


110

Nó phụ thuộc rất nhiều vào những gì bạn muốn làm. Mặc dù trước hết: không ghi đè trực tiếp nó trong quản trị viên Django. Bạn có hai lựa chọn mà tôi nghĩ là hợp lý:

  1. Nếu bạn muốn thay đổi giao diện của quản trị viên nói chung, bạn nên ghi đè các mẫu quản trị viên. Điều này được đề cập chi tiết tại đây: Ghi đè các mẫu quản trị . Đôi khi bạn có thể chỉ cần mở rộng tệp quản trị ban đầu và sau đó ghi đè lên một khối như {% block extrastyle %}{% endblock %}trong django/contrib/admin/templates/admin/base.htmlví dụ.
  2. Nếu kiểu của bạn là kiểu cụ thể, bạn có thể thêm kiểu bổ sung thông qua Medialớp meta trong của bạn admin.py. Xem ví dụ ở đây:
class MyModelAdmin(admin.ModelAdmin):
    class Media:
        js = ('js/admin/my_own_admin.js',)    
        css = {
             'all': ('css/admin/my_own_admin.css',)
        }

Trên thực tế, nó không phải là cấp độ mô hình mà là toàn bộ trang web. Để là các thay đổi cụ thể trong base.css, ie.css, v.v. Một tùy chọn là đưa admin / base.html vào chính ứng dụng của tôi và sử dụng base.css tùy chỉnh của tôi trong tệp admin / base.html. Bằng cách đó, tôi sẽ phải đưa một số tệp mẫu từ quản trị viên django vào trang web của riêng tôi. Có giải pháp nào tốt hơn điều này không?
rajan sthapit 09/09

Tôi không biết. Quản trị viên django cuối cùng không gì khác ngoài một ứng dụng có thể tái sử dụng django. Đó cũng là cách để đi với bất kỳ ứng dụng có thể tái sử dụng nào khác.
Torsten Engelbrecht

Tôi nhận thấy có một tệp .css được liệt kê trong js ở đây ... điều đó có thực sự hoạt động không? Tôi không thể hiểu được.
fastmultiplication

Vâng, bạn đã đúng. Tôi đã mắc lỗi và chỉnh sửa câu trả lời của mình bằng một ví dụ từ tài liệu django.
Torsten Engelbrecht vào

Theo lời của Eli Porter, "Bạn nướng con mèo ngon nhất".
Rob Kwasowski

32
  • Trong settings.py, hãy đảm bảo rằng ứng dụng của bạn được liệt kê trước quản trị viên trong INSTALLED_APPS.
  • Tạo (your-app)/templates/admin/base_site.htmlvà đặt <style>khối vào{% block extrahead %}

Thí dụ:

{% extends "admin/base_site.html" %}
{% block extrahead %}
    <style>
        .field-__str__ {
            font-family: Consolas, monospace;
        }
    </style>
{% endblock %}

6
Câu trả lời tốt nhất. Nếu muốn, bạn cũng có thể tránh liệt kê ứng dụng của mình trước quản trị viên trong INSTALLED_APPS bằng cách đặt thư mục "mẫu" trong dự án cơ sở và tham chiếu nó trong settings.py: TEMPLATES = [... nội dung khác ..., 'DIRS': [ os.path.join (BASE_DIR, 'các mẫu')],]
RedPelle

Ý tưởng tuyệt vời! Hoạt động trơn tru như một cái duyên!
ozw1z5rd

29

Tôi vừa mở rộng admin / base.html để bao gồm một tham chiếu đến tệp css của riêng tôi - ở cuối. Cái hay của css là bạn không phải chạm vào các định nghĩa hiện có, chỉ cần xác định lại.


27

Giải pháp này sẽ hoạt động cho trang web quản trị, tôi nghĩ đó là cách sạch nhất vì nó ghi đè base_site.htmlđiều này không thay đổi khi nâng cấp django.

Tạo trong thư mục mẫu của bạn một thư mục có tên admintrong đó tạo một tệp có tên base_site.html.

Tạo trong thư mục tĩnh của bạn dưới cssmột tệp có tên admin-extra.css.

Viết trong đó tất cả các tùy chỉnh css bạn muốn cho các hình thức của bạn như: body{background: #000;}.

Dán cái này vào base_site.html:

{% extends "admin/base.html" %}
{% load static from staticfiles %} # This might be just {% load static %} in your ENV

{% block title %}{{ title }} | {{ site_title|default:_('Django site admin') }}{% endblock %}

{% block extrastyle %}{{ block.super }}<link rel="stylesheet" type="text/css" href="{% static "css/admin-extra.css" %}" />{% endblock %}

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

{% block nav-global %}{% endblock %}

Như đã đề cập trong phần nhận xét: hãy đảm bảo rằng ứng dụng của bạn có trước ứng dụng quản trị trong INSTALLED_APPS, nếu không, mẫu của bạn không ghi đè lên django's

Đó là nó! bạn đã hoàn tất


4
Cảm ơn, hoạt động tuyệt vời! Nếu nó không hoạt động, hãy đảm bảo rằng ứng dụng của bạn ở trước ứng dụng quản trị INSTALLED_APPS, nếu không, mẫu của bạn không ghi đè django.
Dirbaio

1
Câu trả lời và bình luận tốt nhất. Rất khó để thay đổi màu trên trang quản trị. Xem qua câu trả lời và nhận xét này đã củng cố cách hoạt động của nó.
Daniel Butler

1
Làm sao bạn biết điều đó base_site.htmlsẽ không bao giờ thay đổi khi nâng cấp django? (Tôi có nghĩa là có câu trả lời này là 3 tuổi và vẫn hoạt động nhưng điều đó không có gì garantuee)
Marv

@marv nếu bạn nhìn vào mã nguồn, bạn có thể thấy rất dễ dàng kiến ​​trúc quản trị được xây dựng xung quanh các tên cụ thể này, đặc biệt là trong các url và kết xuất mẫu. các lớp kế thừa các lớp kế thừa các lớp dựa trên các tên này được giữ nguyên trừ khi có một thiết kế lại lớn của khung Django (và thậm chí sau đó tôi sẽ không đặt cược vào sự thay đổi này) quy ước cơ bản tổng thể về ghi đè các chế độ xem quản trị và url quản trị là cũng như ghi đè mẫu cơ sở sẽ giữ nguyên ít nhất trong 3 năm tới theo lộ trình django.
elad silver

1
Vì vậy, đây chỉ là kiến ​​thức chung về django và không có nguồn cụ thể nào xác nhận điều này? Không phải là tôi nghi ngờ bạn, tôi chỉ tự hỏi làm thế nào người ta có thể phát hiện ra rằng đây là trường hợp.
Marv

16

Trong thư mục tĩnh của bạn, hãy tạo một static/admin/css/base.csstệp.

Trước tiên, hãy dán CSS quản trị mặc định của Django , sau đó thêm các tùy chỉnh của bạn ở dưới cùng.


8
Nếu bạn làm điều này, hãy đảm bảo đặt ứng dụng của bạn TRƯỚC django.contrib.admintrong danh sách INSTALLED_APPS. Nếu không, trước tiên, collectstatic sẽ tìm thấy base.css quản trị viên và phiên bản tùy chỉnh của bạn sẽ không ghi đè lên nó.
Dave,

3
Đây không phải là một giải pháp tốt về lâu dài. Nó sao chép / dán một loạt mã và nó sẽ không được duy trì khi Django nâng cấp.
mlissner

Mọi kiểu dáng đối với quản trị viên Django về cơ bản là một nhánh của mã. Bản cập nhật cho Django có thể phá vỡ các tùy chỉnh của bạn. Khuyến nghị của tôi là giữ các tùy chỉnh ở mức tối thiểu và thêm chúng vào cuối kiểu dáng mặc định của Django. Sau đó, bạn có thể cập nhật kiểu mặc định theo cách thủ công nếu và khi bạn muốn.
Ryan Allen,

Câu trả lời của @ danny-w-adair ở trên là tốt hơn; giữ mọi thứ ở trạng thái "KHÔ", nhưng nó vẫn là một nhánh mã của Django có thể dẫn đến những khó khăn khi nâng cấp nhỏ.
Ryan Allen,

10

Nếu bạn muốn có phạm vi toàn cầu và bạn không muốn nghĩ đến việc ghi đè các mẫu, thì mixin hoạt động thực sự tốt cho việc này. Đặt mã này bất cứ nơi nào bạn muốn:

class CSSAdminMixin(object):
    class Media:
        css = {
            'all': ('css/admin.css',),
        }

Sau đó, tạo một tệp CSS được gọi admin.cssbằng ghi đè của bạn, ví dụ:

select[multiple] {
    resize: vertical;
}

Sau đó, trong bất kỳ mô hình nào bạn muốn, hãy làm:

class MyModelAdmin(admin.ModelAdmin, CSSAdminMixin):

Và bạn sẽ sẵn sàng.


Tôi thích câu trả lời của bạn, nhưng tại sao không thêm trực tiếp đến MyModelAdmin
Goran

1
Bạn có thể làm điều đó nếu đó là một mô hình, nhưng nó sẽ lộn xộn nếu bạn làm điều đó với nhiều mô hình.
mlissner 13/1017

4

admin/css/changelists.cssbên trong một thư mục STATICFILES_DIRSvà nó sẽ sử dụng changelists.css thay vì quản trị viên mặc định.

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.