Django
Podawanie
Szukaj…
Wykaz zmian
Załóżmy, że masz prostą aplikację myblog
z następującym modelem:
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()
„Lista zmian” Django Admin to strona z listą wszystkich obiektów danego modelu.
from django.contrib import admin
from myblog.models import Article
@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
pass
Domyślnie użyje metody __str__()
(lub __unicode__()
jeśli używasz python2) twojego modelu, aby wyświetlić obiekt „name”. Oznacza to, że jeśli go nie zastąpisz, zobaczysz listę artykułów o nazwie „Obiekt artykułu”. Aby zmienić to zachowanie, możesz ustawić __str__()
:
class Article(models.Model):
def __str__(self):
return self.title
Teraz wszystkie artykuły powinny mieć inną nazwę i być bardziej wyraźne niż „Obiekt artykułu”.
Jednak możesz chcieć wyświetlić inne dane na tej liście. W tym celu użyj list_display
:
@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
list_display = ['__str__', 'author', 'date_published', 'is_draft']
list_display
nie ogranicza się do pól i właściwości modelu. może to być również metoda Twojego 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'
Dodatkowe style CSS i skrypty JS dla strony administratora
Załóżmy, że masz prosty model 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)
Rejestrujesz go w Django admin i dodajesz pole wyszukiwania według first_name
i last_name
:
@admin.register(Customer)
class CustomerAdmin(admin.ModelAdmin):
list_display = ['first_name', 'last_name', 'is_premium']
search_fields = ['first_name', 'last_name']
Po wykonaniu tej czynności pola wyszukiwania pojawią się na stronie listy administratorów z domyślnym symbolem zastępczym: „ słowo kluczowe ”. Ale co, jeśli chcesz zmienić ten symbol zastępczy na „ Szukaj według nazwy ”?
Możesz to zrobić, przekazując niestandardowy plik JavaScript do administratora 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', )
Możesz użyć paska narzędzi debugowania przeglądarki, aby znaleźć identyfikator lub klasę Django ustawioną na tym pasku wyszukiwania, a następnie napisać kod js:
$(function () {
$('#searchbar').attr('placeholder', 'Search by name')
})
Również klasa Media
pozwala dodawać pliki css z obiektem słownika:
class Media:
css = {
'all': ('css/admin/styles.css',)
}
Na przykład musimy wyświetlić każdy element kolumny first_name
w określonym kolorze.
Domyślnie Django utworzyć kolumnę tabeli dla każdej pozycji w list_display
, wszystko <td>
znaczniki będą miały klasę css jak field-'list_display_name'
, w naszym przypadku będzie to field_first_name
.field_first_name {
background-color: #e6f2ff;
}
Jeśli chcesz dostosować inne zachowanie, dodając JS lub niektóre style css, zawsze możesz sprawdzić id i klasy elementów w narzędziu do debugowania przeglądarki.
Postępowanie z kluczami obcymi odnoszącymi się do dużych tabel
Domyślnie Django renderuje pola ForeignKey
jako dane wejściowe <select>
. Może to powodować, że strony będą ładowane bardzo wolno, jeśli masz tysiące lub dziesiątki tysięcy wpisów w tabeli, do której się odwołujesz. I nawet jeśli masz tylko setki wpisów, znalezienie jakiegoś konkretnego wpisu jest dość niewygodne.
Bardzo przydatnym zewnętrznym modułem do tego jest django-autocomplete-light (DAL). Umożliwia to użycie pól autouzupełniania zamiast pól <select>
.
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