Django Administrationsoberfläche

Ernesto Rico Schmidt am 2. März 2018

Eines der wichtigsten features von Django ist die mitgelieferte und sehr einfach anzupassende Administrationsoberfläche.

Für jede Applikation in Django kann man eine Administrationsoberfläche definieren.

Darin kann man definieren für welche Modelle der Applikation es eine Oberfläche gibt, und wie man die einzelnen Objekte verwalten kann, sprich: neue anlegen, vorhandene editieren oder löschen, etc., und diese auch nach Wunsch anpassen und erweitern

Eine weitere Möglichkeit, außerhalb der Administrationsoberfläche, Objekte sehr einfach zu verwalten, bieten die so genannten Klassen basierte Views, ins Besondere für die Formularverarbeitung mit Klassen basierten Views und die Generische Bearbeitungs-Views um Formulare zu behandeln.

Die Formulare in Django und generische Klassen basierte Views werden nächste Woche Thema sein.

Die Administrationsoberfläche spielt eine Zentrale Rolle bei der Applikation seguimiento. Dass die Daten, die gescrappt werden, in eine relationale Datenbank gespeichert werden ist einfach dem Umstand geschuldet, dass es mit den Modell in Django eine sehr einfach anzupassende Administrationsoberfläche quasi gratis gibt.

Die Administrationsoberfläche für die Applikation seguimiento wird in einer Datei admin.py innerhalb dieser definiert.

Mit der Oberfläche kann man sehr schnell aus der Menge an Ausschreibungen (am die hundert jeden Tag) einen Überblick bekommen, und als erstes entscheiden, welche Ausschreibung keine weitere Überprüfung benötigen.

Wir definieren als zunächst, dass das Modell Convocatoria über die Oberfläche administriert wird. Dazu registrieren wir die entsprechende Klasse ConvocatoriaAdmin, eine Subklasse von admin.ModelAdmin, mit Hilfe des @admin.register-Dekorators.

from django.contrib import admin
from django.utils.html import format_html

from .models import Convocatoria


@admin.register(Convocatoria)
class ConvocatoriaAdmin(admin.ModelAdmin):

Dann definieren wir, dass es eine Aktion gibt, um zu markieren dass ausgewählte Ausschreibungen keine weitere Überprüfung benötigen. Z.B. weil es sich dabei um ganz normale Güter, Bertatungen oder Dienstleitungen geht, die nichts mit Software und Softwareentwicklung zu tun haben.

    actions = ['no_necesitan_revisión']

Wir werden die Felder objeto, entidad, añadida und estatus (das Objekt der Ausschreibung, die Körperschaft, die es ausschreibt, das Datum des Imports, und den Status der Ausschreibung) in der Liste der Ausschreibungen anzeigen.

    list_display = ('objeto', 'entidad', 'añadida', 'estatus')

Django Administrationsoberfläche - Ausschreibungen

Wir definieren die Felder departamento, tipo und estatus (das Departement, die Art der Ausschreibung und den Status) als Filter.

    list_filter = ('departamento', 'tipo', 'estatus')

Django Administrationsoberfläche - Ausschreibungen Filter

Als nächstes definieren wir, wie die Seite einer Ausschreibung aussieht.

Die erste Gruppe von Feldern wird immer aufegeklappt und ohne Überschrift bzw. Gruppenname angezeigt. Dann werden weitere Felder in aufklappbaren Gruppen angezeigt. Die Gruppen D.B.C (das Basisdokument der Ausschreibung, von wem und wann es überprüft wurde), Fechas (das Datum der Veröffentlichung und der Präsentation der Ausschreibung) und Monto (den Betrag der Ausschreibung in pesos bolivianos, US-Dollar und Euros).

Hier sind nicht nur Felder einer Ausschreibung (Modell Convocatoria) erlaubt, sondern auch Funktionen wie enlace_infosicoes, die wir weiter unten definieren werden.

    fieldsets = [
        (None, {
            'fields': [
                'slug', 'departamento', 'entidad', 'tipo', 'modalidad',
                'objeto', 'enlace_infosicoes', 'estatus', 'impugnada',
                'notas'
            ]}),
        ('D.B.C', {
            'classes': ('collapse',),
            'fields': ['documento', 'revisor', 'revisado']
        }),
        ('Fechas', {
            'classes': ('collapse',),
            'fields': ['publicada', 'presentada']
        }),
        ('Monto', {
            'classes': ('collapse',),
            'fields': ['monto_bob', 'monto_usd', 'monto_eur']
        }),
    ]

Django Administrationsoberfläche - Ausschreibung

Als nächstes definieren wir welche Felder nur gelesen (angezeigt) werden und nicht verändert werden dürfen.

    readonly_fields = (
        'departamento', 'entidad', 'slug', 'objeto', 'enlace_infosicoes',
        'modalidad', 'tipo', 'añadida', 'publicada', 'presentada',
        'contacto', 'monto_bob', monto_usd', 'monto_eur', 'documento'
    )

Wir legen auch fest, dass auch oben ein Knopf zu speichern vorhanden sein wird, denn die Seite kann mit allen aufegeklappten Gruppen sehr lang werden.

    save_on_top = True

Wir definieren, dass mit dem Suchfeld innerhalb der Felder objeto, entidad und slug (den eindeutigen Code der Ausschreibung) gesucht wird.

    search_fields = ('objeto', 'entidad', 'slug')

Schließlich definieren wir, was die Aktion no_necesitan_revisión macht. Sie aktualisiert das Feld estatus=2 bei allen ausgewählten Ausschreibungen. Und wir definieren den Text, der bei der Auswahl der Aktionen angezeigt wird.

    def no_necesitan_revisión(self, request, queryset):
        queryset.update(estatus=2)

    no_necesitan_revisión.short_description = "Marcar que las Convocatorias selecionadas no necesitan revisión"

Zum Schluss definieren wir was die Funktion enlace_infosicoes ausgibt. Sie zeigt in der Administrationsseite den Link der Ausschreibung auf der Plattform von INFOSICOES als Link.

    def enlace_infosicoes(self, obj):
        return format_html("<a href='{url}'>{url}</a>", url=obj.enlace)

Das Django-Projekt seguimiento ist auf GitHub zu finden