Django
администрация
Поиск…
Список изменений
Допустим, у вас есть простое приложение myblog
со следующей моделью:
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()
Django Admin «Список изменений» - это страница, в которой перечислены все объекты данной модели.
from django.contrib import admin
from myblog.models import Article
@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
pass
По умолчанию он будет использовать метод __str__()
(или __unicode__()
если вы на python2) вашей модели, чтобы отобразить «имя» объекта. Это означает, что если вы не отменили его, вы увидите список статей, все с именем «Объект статьи». Чтобы изменить это поведение, вы можете установить метод __str__()
:
class Article(models.Model):
def __str__(self):
return self.title
Теперь все ваши статьи должны иметь другое имя и более четко, чем «Объект статьи».
Однако вы можете отображать другие данные в этом списке. Для этого используйте list_display
:
@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
list_display = ['__str__', 'author', 'date_published', 'is_draft']
list_display
не ограничивается полями и свойствами модели. он также может быть методом вашего 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'
Дополнительные стили CSS и сценарии JS для страницы администратора
Предположим, у вас простая модель 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)
Вы регистрируете его в администраторе Django и добавляете поле поиска по имени first_name
и last_name
:
@admin.register(Customer)
class CustomerAdmin(admin.ModelAdmin):
list_display = ['first_name', 'last_name', 'is_premium']
search_fields = ['first_name', 'last_name']
После этого поля поиска появятся на странице списка администраторов с пометкой по умолчанию: « keyword ». Но что, если вы хотите изменить этот заполнитель на « Поиск по имени »?
Вы можете сделать это, отправив пользовательский файл Javascript в 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', )
Вы можете использовать панель инструментов debug debug, чтобы определить, какой идентификатор или класс Django установлен для этой панели поиска, а затем написать код js:
$(function () {
$('#searchbar').attr('placeholder', 'Search by name')
})
Также Media
класс позволяет добавлять файлы css со словарным объектом:
class Media:
css = {
'all': ('css/admin/styles.css',)
}
Например, нам нужно отобразить каждый элемент столбца first_name
в определенном цвете.
По умолчанию Django создает столбец таблицы для каждого элемента в list_display
, все теги <td>
будут иметь класс css, такой как field-'list_display_name'
, в нашем случае он будет field_first_name
.field_first_name {
background-color: #e6f2ff;
}
Если вы хотите настроить другое поведение, добавив JS или некоторые стили CSS, вы всегда можете проверить id `s и классы элементов в инструменте отладки браузера.
Работа с внешними ключами, ссылающимися на большие таблицы
По умолчанию Django отображает поля ForeignKey
как <select>
. Это может привести к тому, что страницы будут загружаться очень медленно, если у вас есть тысячи или десятки тысяч записей в ссылочной таблице. И даже если у вас есть только сотни записей, довольно неудобно искать определенную запись среди всех.
Для этого очень удобный внешний модуль - django-autocomplete-light (DAL). Это позволяет использовать поля автозаполнения вместо полей <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