Some of these styles have since been accepted into the Django repository. I'll leave this post up though since the process is still the same and you may have different ideas for your own styling.

Styling the Django admin is is pretty simple. Here's a small bit of CSS you can add to the bottom of Django's default admin CSS to make it a little nicer and more user friendly. Place the file in your static directory static/admin/css/base.css.

/* Place these styles at the bottom of the default Django admin styles
https://raw.github.com/django/django/master/django/contrib/admin/static/admin/css/base.css*/

body {
    background: #fdfdfd;
    font-family: 'Lucida Grande', Arial, sans-serif;
}
#header {
    background: #fbfbfb; 
    background: linear-gradient(to bottom, #fdfdfd 25%, #ececec 100%);
    border-bottom: 1px solid #b2b2b2;
}
#header, #branding h1 {
    color:#181818;
}
#header a:link, #header a:visited {
    text-decoration:none;
    color:#1B9EE0;
}
#header a:hover {
    text-decoration:none;
    color:#0E8FCF;
}
div.module {
    border-radius: 3px;
}
ul.messagelist li {
    background: #dcffd5 url(../img/icon_success.gif) 5px .3em no-repeat;
}
ul.messagelist li.warning {
    background: #ffc url(../img/icon_alert.gif) 5px .3em no-repeat;
}
ul.messagelist li.error {
    background: #fff5f4 url(../img/icon_error.gif) 5px .3em no-repeat;
}
.errornote {
    border: 1px solid #dd2222;
    color: #dd1111;
    background: #fff5f4 url(../img/icon_error.gif) 5px .3em no-repeat;
}
ul.errorlist {
    border: 1px solid #cc1111;
    color: #ffffff;
    background: #dd1111 url(../img/icon_alert.gif) 5px .3em no-repeat;
}
ul.errorlist li {
    background: transparent;
    border: none;
    margin: 3px 0 0 0;
}
ul.errorlist li:first-child {
    margin-top: 0;
}
.errors, .form-row.errors {
    background: #fff5f4;
}
.errors input, .errors select, .errors textarea {
    border: 1px solid #dd1111;
}

Then add admin/base_site.html to your templates directory and paste the default. Replace Django site admin with your own site name. I like to customize the welcome-msg block and userlinks as well, including a link to the site's home page.

{% extends "admin/base.html" %}
{% load i18n %}

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

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

{% block welcome-msg %}
    {% trans 'Hey,' %}
    <strong>{% firstof user.get_short_name user.get_username %}</strong>.
{% endblock %}

{% block userlinks %}
    <a href="{% url 'home' %}">{% trans 'View Site' %}</a> /
    
    {% if user.has_usable_password %}
    <a href="{% url 'admin:password_change' %}">{% trans 'Change password' %}</a> /
    {% endif %}

    <a href="{% url 'admin:logout' %}">{% trans 'Log out' %}</a>
{% endblock %}

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