Django
Toediening
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.
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