Suche…


Änderungsliste

Nehmen wir an, Sie haben eine einfache myblog App mit folgendem Modell:

from django.conf import settings
from django.utils import timezone

class Article(models.Model):
    title = models.CharField(max_length=70)
    slug = models.SlugField(max_length=70, unique=True)
    author = models.ForeignKey(settings.AUTH_USER_MODEL, models.PROTECT)
    date_published = models.DateTimeField(default=timezone.now)
    is_draft = models.BooleanField(default=True)
    content = models.TextField()

Die "Änderungsliste" von Django Admin ist die Seite, auf der alle Objekte eines bestimmten Modells aufgeführt sind.

from django.contrib import admin
from myblog.models import Article

@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
    pass

Standardmäßig verwendet es die __str__() Methode (oder __unicode__() wenn Sie sich auf python2) Ihres Modells befinden, um das Objekt "name" anzuzeigen. Das bedeutet, wenn Sie es nicht überschrieben haben, wird eine Liste mit Artikeln angezeigt, die alle "Artikelobjekt" genannt werden. Um dieses Verhalten zu ändern, können Sie die Methode __str__() :

class Article(models.Model):
    def __str__(self):
        return self.title

Jetzt sollten alle Ihre Artikel einen anderen Namen haben und expliziter als "Artikelobjekt" sein.

Möglicherweise möchten Sie jedoch andere Daten in dieser Liste anzeigen. Verwenden Sie dazu list_display :

@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
    list_display = ['__str__', 'author', 'date_published', 'is_draft']

list_display ist nicht auf die list_display und -eigenschaften beschränkt. Es kann auch eine Methode Ihres ModelAdmin :

from django.forms.utils import flatatt
from django.urls import reverse
from django.utils.html import format_html

@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
    list_display = ['title', 'author_link', 'date_published', 'is_draft']
    
    def author_link(self, obj):
        author = obj.author
        opts = author._meta
        route = '{}_{}_change'.format(opts.app_label, opts.model_name)
        author_edit_url = reverse(route, args=[author.pk])
        return format_html(
            '<a{}>{}</a>', flatatt({'href': author_edit_url}), author.first_name)

    # Set the column name in the change list
    author_link.short_description = "Author"
    # Set the field to use when ordering using this column
    author_link.admin_order_field = 'author__firstname'

Zusätzliche CSS-Stile und JS-Skripts für die Verwaltungsseite

Angenommen, Sie haben ein einfaches Customer :

class Customer(models.Model):
    first_name = models.CharField(max_length=255)
    last_name = models.CharField(max_length=255)
    is_premium = models.BooleanField(default=False)

Du registrierst es im Django-Administrator und first_name Suchfeld mit first_name und last_name :

@admin.register(Customer)
class CustomerAdmin(admin.ModelAdmin):
    list_display = ['first_name', 'last_name', 'is_premium']
    search_fields = ['first_name', 'last_name']

Nachdem Sie dies getan haben, werden die Suchfelder auf der Admin-Listenseite mit dem Standardplatzhalter angezeigt: " Schlüsselwort ". Was aber, wenn Sie diesen Platzhalter in " Suche nach Namen " ändern möchten?

Sie können dies tun, indem Sie eine benutzerdefinierte Javascript-Datei an admin Media :

@admin.register(Customer)
class CustomerAdmin(admin.ModelAdmin):
    list_display = ['first_name', 'last_name', 'is_premium']
    search_fields = ['first_name', 'last_name']
    
    class Media:
        #this path may be any you want, 
        #just put it in your static folder
        js = ('js/admin/placeholder.js', )

Sie können die Browser-Debug-Symbolleiste verwenden, um herauszufinden, welche ID oder Klasse Django für diese Suchleiste festgelegt hat, und anschließend Ihren Js-Code schreiben:

$(function () {
   $('#searchbar').attr('placeholder', 'Search by name')
})

Mit der Media können Sie auch CSS-Dateien mit Wörterbuchobjekt hinzufügen:

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

Zum Beispiel müssen wir jedes Element der Spalte first_name in einer bestimmten Farbe anzeigen.
Standardmäßig erstellt Django für jedes Element in list_display eine Tabellenspalte. Alle <td> -Tags haben eine css-Klasse wie field-'list_display_name' , in unserem Fall field_first_name

.field_first_name {
     background-color: #e6f2ff;
 }

Wenn Sie ein anderes Verhalten durch Hinzufügen von JS oder einigen CSS-Formatvorlagen anpassen möchten, können Sie die IDs und Elementklassen im Browser-Debug-Tool jederzeit überprüfen.

Umgang mit Fremdschlüsseln, die auf große Tabellen verweisen

Standardmäßig rendert Django ForeignKey Felder als <select> ForeignKey . Dies kann dazu führen, dass Seiten sehr langsam geladen werden, wenn in der referenzierten Tabelle Tausende oder Zehntausende Einträge vorhanden sind. Und selbst wenn Sie nur Hunderte von Einträgen haben, ist es ziemlich unangenehm, unter allen Einträgen nach einem bestimmten Eintrag zu suchen.

Ein sehr praktisches externes Modul dafür ist Django-Autocomplete-Light (DAL). Dies ermöglicht die Verwendung von Feldern zur automatischen Vervollständigung anstelle von Feldern <select> .

django-autocomplete-light beispiel

views.py

from dal import autocomplete

class CityAutocomp(autocomplete.Select2QuerySetView):
    def get_queryset(self):
        qs = City.objects.all()
        if self.q:
            qs = qs.filter(name__istartswith=self.q)
        return qs

urls.py

urlpatterns = [
    url(r'^city-autocomp/$', CityAutocomp.as_view(), name='city-autocomp'),
]

forms.py

from dal import autocomplete

class PlaceForm(forms.ModelForm):
    city = forms.ModelChoiceField(
        queryset=City.objects.all(),
        widget=autocomplete.ModelSelect2(url='city-autocomp')
    )

    class Meta:
        model = Place
        fields = ['__all__']

admin.py

@admin.register(Place)
class PlaceAdmin(admin.ModelAdmin):
    form = PlaceForm


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow