Zoeken…


Aanpassingslijst

Stel dat u een eenvoudige myblog app hebt met het volgende model:

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()

De "wijzigingslijst" van Django Admin is de pagina met alle objecten van een bepaald model.

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

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

Standaard wordt de methode __str__() (of __unicode__() als u op python2) van uw model gebruikt om het object 'naam' weer te geven. Dit betekent dat als u het niet hebt overschreven, u een lijst met artikelen ziet, allemaal met de naam "Artikelobject". Om dit gedrag te veranderen, kunt u de __str__() methode instellen:

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

Nu moeten al uw artikelen een andere naam hebben en explicieter zijn dan 'Artikelobject'.

Mogelijk wilt u echter andere gegevens in deze lijst weergeven. Gebruik hiervoor list_display :

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

list_display is niet beperkt tot de list_display en eigenschappen. het kan ook een methode van uw 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'

Aanvullende CSS-stijlen en JS-scripts voor beheerderspagina

Stel dat u een eenvoudig 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)

U registreert het in de Django admin en voeg zoekveld door first_name en last_name :

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

Nadat u dit hebt gedaan, verschijnen de zoekvelden op de pagina met de beheerderslijst met de standaard tijdelijke aanduiding: " trefwoord ". Maar wat als u die tijdelijke aanduiding wilt wijzigen in ' Zoeken op naam '?

U kunt dit doen door een aangepast Javascript-bestand door te geven aan 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', )

U kunt de browser-foutopsporingswerkbalk gebruiken om te achterhalen welke id of klasse Django op deze zoekbalk is ingesteld en vervolgens uw js-code te schrijven:

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

Ook kunt u met Media klasse css-bestanden toevoegen met woordenboekobject:

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

We moeten bijvoorbeeld elk element van de kolom first_name in een specifieke kleur weergeven.
Standaard maakt Django een tabelkolom aan voor elk item in list_display , alle <td> -tags hebben css-klasse zoals field-'list_display_name' , in ons geval field_first_name

.field_first_name {
     background-color: #e6f2ff;
 }

Als u ander gedrag wilt aanpassen door JS of sommige css-stijlen toe te voegen, kunt u altijd id's en klassen van elementen controleren in het hulpprogramma voor foutopsporing van de browser.

Omgaan met buitenlandse sleutels die verwijzen naar grote tabellen

Django geeft standaard ForeignKey velden weer als een <select> -ingang. Dit kan ertoe leiden dat pagina's heel langzaam worden geladen als er duizenden of tienduizenden vermeldingen in de tabel staan waarnaar wordt verwezen. En zelfs als u slechts honderden vermeldingen hebt, is het vrij oncomfortabel om onder alle gebruikers naar een bepaalde vermelding te zoeken.

Een zeer handige externe module hiervoor is django-autocomplete-light (DAL). Dit maakt het mogelijk om velden voor automatisch aanvullen te gebruiken in plaats van <select> velden.

django-autocomplete-light voorbeeld

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
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow