Расширение сайта администрирования с кастомными представлениями

Иногда может понадобиться настроить сайт администрирования сверх того, что возможно с помощью конфигурации 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> &rsaquo;
        <a href="{% url "admin:orders_order_changelist" %}">Orders</a>
        &rsaquo;
        <a href="{% url "admin:orders_order_change" order.id %}">Order {{ order.id }}</a>
        &rsaquo; 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.

results matching ""

    No results matching ""