Django'da yönetici css'i geçersiz kılma


Yanıtlar:


111

Ne yapmak istediğinize bağlı. Her şeyden önce: doğrudan Django yöneticisinde üzerine yazmayın. Makul olduğunu düşündüğüm iki seçeneğiniz var:

  1. Genel olarak yöneticinin görünümünü değiştirmek istiyorsanız, yönetici şablonlarını geçersiz kılmalısınız. Bu, burada ayrıntılarla ele alınmıştır: Yönetici şablonlarını geçersiz kılma . Bazen sadece orijinal yönetici dosyasını uzatabilir ve sonra gibi bir blok üzerine {% block extrastyle %}{% endblock %}de django/contrib/admin/templates/admin/base.htmlbir örnek olarak.
  2. Stil modeli özgü ise size yoluyla ek stilleri ekleyebilir MediaGözlerinde farklı meta sınıfında admin.py. Burada bir örneğe bakın:
class MyModelAdmin(admin.ModelAdmin):
    class Media:
        js = ('js/admin/my_own_admin.js',)    
        css = {
             'all': ('css/admin/my_own_admin.css',)
        }

Aslında, model düzeyinde değil, tüm sitenin kendisi. Base. Bu şekilde, django yöneticisinden kendi siteme bazı şablon dosyaları eklemem gerekecek. Bundan daha iyi bir çözüm var mı?
rajan sthapit

Hiçbiri farkında değilim. Sonunda django yöneticisi, yeniden kullanılabilir bir django uygulamasından başka bir şey değildir. Başka herhangi bir yeniden kullanılabilir uygulamayla da gitmenin yolu budur.
Torsten Engelbrecht

Buradaki js içinde listelenen bir .css dosyası olduğunu fark ettim ... bu gerçekten çalışıyor mu? Alamıyorum
fastmultiplication

Evet haklısın. Bir hata yaptım ve cevabımı django belgelerinden bir örnekle düzenledim.
Torsten Engelbrecht

Eli Porter'ın sözleriyle, "En iyi kediyi ızgara yaptın".
Rob Kwasowski

34
  • İçinde settings.py, uygulamanızın içinde yöneticiden önce listelendiğinden emin olun INSTALLED_APPS.
  • Bloğu oluşturun (your-app)/templates/admin/base_site.htmlve<style>{% block extrahead %}

Misal:

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

6
En iyi cevap. İsterseniz, temel projeye bir "şablon" dizini ekleyerek ve bunu settings.py: TEMPLATES = [... diğer şeyler ..., 'DIRS': [ os.path.join (BASE_DIR, 'templates')],]
RedPelle

İyi fikir! Bir cazibe gibi sorunsuz çalışır!
ozw1z5.

29

Sonunda kendi css dosyama bir referans eklemek için admin / base.html'yi genişlettim. Css'nin güzelliği, mevcut tanımlara dokunmanıza gerek kalmaması, sadece yeniden tanımlamanızdır.


28

Bu çözüm yönetici sitesi için işe yarayacak, bunun en temiz yol olduğunu düşünüyorum çünkü base_site.htmldjango'yu yükseltirken değişmeyen şeyi geçersiz kılıyor .

Şablonlar dizininizde, adı verilen bir klasör adminoluşturun, adlı bir dosya oluşturun base_site.html.

Altında statik dizinde oluşturun cssadında bir dosyaya admin-extra.css.

İçinde sen gibi formlar için istediğiniz tüm özel css yazın: body{background: #000;}.

Bunu şuraya yapıştırın 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 %}

Yorumlarda belirtildiği gibi: Uygulamanızın INSTALLED_APPS içindeki yönetici uygulamasından önce olduğundan emin olun, aksi takdirde şablonunuz django'yu geçersiz kılmaz

Bu kadar! sen bittin


4
Teşekkürler, harika çalışıyor! Çalışmazsa, uygulamanızın yönetici uygulamasından önce olduğundan emin olun INSTALLED_APPS, aksi takdirde şablonunuz django'yu geçersiz kılmaz.
Dirbaio

1
En iyi cevap ve yorum. Yönetici sayfasındaki rengi değiştirmek şaşırtıcı derecede zordur. Bu cevabı ve yorumu gözden geçirmek, nasıl çalıştığını sağlamlaştırdı.
Daniel Butler

1
base_site.htmlDjango'yu yükseltirken bunun asla değişmeyeceğini nereden biliyorsun ? (Ben kötü mü evet bu cevabı 3 yaşında ve hala çalışır ama hiçbir garantuee var)
Marv

@marv, kaynak kodda başlığın altına bakarsanız, yönetici mimarisinin özellikle URL'lerde ve şablon oluşturmada bu belirli adlar etrafında kurulduğunu çok kolay görebilirsiniz. Sınıfları miras alan sınıfları miras alan sınıflar, Django çerçevesinin büyük bir yeniden tasarımı olmadığı sürece (ve o zaman bile bu değişikliğe bahse girmem), yönetici görünümlerini ve yönetici URL'lerini geçersiz kılma genel temel kuralını ve temel şablonu geçersiz kılmak, en azından django yol haritasına göre önümüzdeki 3 yıl boyunca aynı kalacaktır.
elad silver

1
Yani bu sadece django hakkında genel bilgi ve bunu doğrulayan somut bir kaynak yok mu? Senden şüphe duyduğumdan değil, sadece durumun böyle olduğunu nasıl öğrenmesi gerektiğini merak ediyorum.
Marv

17

Statik dizininizde bir static/admin/css/base.cssdosya oluşturun.

Önce Django'nun varsayılan Admin CSS'sine yapıştırın , ardından özelleştirmelerinizi en alta ekleyin.


8
Bunu yaparsanız, uygulamanızı BEFORE django.contrib.adminlistesine koyduğunuzdan emin olun INSTALLED_APPS. Bunu yapmazsanız, collecstatic önce admin base.css dosyasını bulur ve özelleştirilmiş sürümünüz onun üzerine yazmaz.
Dave

3
Bu uzun vadeli iyi bir çözüm değil. Bir grup kodu kopyalar / yapıştırır ve Django yükseltilirken korunmayacaktır.
mlissner

Django yöneticisine yapılan herhangi bir stil, temelde kodun bir çatalı. Django'da yapılacak bir güncelleme, özelleştirmelerinizi gerçekten bozabilir. Benim tavsiyem, özelleştirmeleri minimumda tutmak ve bunları Django'nun varsayılan stilinin altına eklemek. Ardından, istediğiniz zaman ve istediğiniz zaman varsayılan stili manuel olarak güncelleyebilirsiniz.
Ryan Allen

@ danny-w-adair'in yukarıdaki cevabı daha iyi; her şeyi "KURU" tutar, ancak yine de Django'nun kodunun küçük yükseltme sorunlarına yol açabilecek bir çatalı.
Ryan Allen

10

Küresel bir kapsam istiyorsanız ve şablonları geçersiz kılmayı düşünmek istemiyorsanız, bir mixin bunun için gerçekten işe yarar. Bu kodu istediğiniz yere koyun:

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

Ardından, admin.cssgeçersiz kılmalarınızla çağrılan bir CSS dosyası oluşturun , örneğin:

select[multiple] {
    resize: vertical;
}

Ardından, istediğiniz modelde şunları yapın:

class MyModelAdmin(admin.ModelAdmin, CSSAdminMixin):

Ve her şey hazır olacak.


Cevabını gibi ama neden olmasın MyModelAdmin doğrudan eklemek
Goran

1
Tek modelse bunu yapabilirsiniz, ancak birçok modele yaparsanız dağınık olacaktır.
mlissner

4

admin/css/changelists.cssİçinde bir klasör var STATICFILES_DIRSve varsayılan yönetici yerine changelists.css'yi kullanacak.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.