Расширение сайта администрирования с кастомными представлениями
Иногда может понадобиться настроить сайт администрирования сверх того, что возможно с помощью конфигурации ModelAdmin, создания действий администратора и переопределения шаблонов администратора. В этом случае необходимо создать настраиваемое административное представление. С помощью кастомного представления можно создавать любые необходимые функциональные возможности.
Создадим кастомное представление для отображения сведений о заказе. Измените файл views.py приложения orders и добавьте в него следующий код:
from django.contrib.admin.views.decorators import staff_member_required
from django.shortcuts import get_object_or_404
from .models import Order
@staff_member_required
def admin_order_detail(request, order_id):
order = get_object_or_404(Order, id=order_id)
return render(request,
'admin/orders/order/detail.html',
{'order': order})
Декоратор staff_member_required проверяет, что как is_active, так и is_staff поля пользователя, запрашивающего страницу, имеют значение True. В этом представлении можно получить объект Order с заданным идентификатором и визуализировать шаблон для отображения заказа.
Теперь отредактируйте файл urls.py приложения orders и добавьте к нему следующий шаблон URL-адреса:
url(r'^admin/order/(?P<order_id>\d+)/$', views.admin_order_detail, name='admin_order_detail'),
Создайте следующую структуру файла в каталоге templates/ приложения orders:
admin/
orders/
order/
detail.html
Измените шаблон detail.html и добавьте в него следующее содержимое:
{% extends "admin/base_site.html" %}
{% load static %}
{% block extrastyle %}
<link rel="stylesheet" type="text/css" href="{% static "css/admin.css" %}" />
{% endblock %}
{% block title %}
Order {{ order.id }} {{ block.super }}
{% endblock %}
{% block breadcrumbs %}
<div class="breadcrumbs">
<a href="{% url "admin:index" %}">Home</a> ›
<a href="{% url "admin:orders_order_changelist" %}">Orders</a>
›
<a href="{% url "admin:orders_order_change" order.id %}">Order {{ order.id }}</a>
› Detail
</div>
{% endblock %}
{% block content %}
<h1>Order {{ order.id }}</h1>
<ul class="object-tools">
<li>
<a href="#" onclick="window.print();">Print order</a>
</li>
</ul>
<table>
<tr>
<th>Created</th>
<td>{{ order.created }}</td>
</tr>
<tr>
<th>Customer</th>
<td>{{ order.first_name }} {{ order.last_name }}</td>
</tr>
<tr>
<th>E-mail</th>
<td><a href="mailto:{{ order.email }}">{{ order.email }}</a></td>
</tr>
<tr>
<th>Address</th>
<td>{{ order.address }}, {{ order.postal_code }} {{ order.city }}</td>
</tr>
<tr>
<th>Total amount</th>
<td>${{ order.get_total_cost }}</td>
</tr>
<tr>
<th>Status</th>
<td>{% if order.paid %}Paid{% else %}Pending payment{% endif %}</td>
</tr>
</table>
<div class="module">
<div class="tabular inline-related last-related">
<table>
<h2>Items bought</h2>
<thead>
<tr>
<th>Product</th>
<th>Price</th>
<th>Quantity</th>
<th>Total</th>
</tr>
</thead>
<tbody>
{% for item in order.items.all %}
<tr class="row{% cycle "1" "2" %}">
<td>{{ item.product.name }}</td>
<td class="num">${{ item.price }}</td>
<td class="num">{{ item.quantity }}</td>
<td class="num">${{ item.get_cost }}</td>
</tr>
{% endfor %}
<tr class="total">
<td colspan="3">Total</td>
<td class="num">${{ order.get_total_cost }}</td>
</tr>
</tbody>
</table>
</div>
</div>
{% endblock %}
Это шаблон для отображения сведений о заказе на сайте администрирования. Он расширяет шаблон admin/base_site.html сайта администрирования Джанго, который содержит основную структуру HTML и стили CSS для администратора. Мы загружаем пользовательский статический файл css/admin.css.