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()
장고 관리자의 "변경 목록"은 주어진 모델의 모든 개체를 나열하는 페이지입니다.
from django.contrib import admin
from myblog.models import Article
@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
pass
기본적으로 모델의 __str__()
메서드 (또는 __unicode__()
경우 __unicode__()
)를 사용하여 "name"개체를 표시합니다. 즉,이를 덮어 쓰지 않으면 기사 목록이 표시되며 모두 '기사 개체'로 표시됩니다. 이 동작을 변경하려면 __str__()
메서드를 설정할 수 있습니다.
class Article(models.Model):
def __str__(self):
return self.title
자, 모든 기사는 다른 이름을 가져야하며 "기사 객체"보다 분명합니다.
그러나이 목록에 다른 데이터를 표시 할 수 있습니다. 이를 위해 list_display
사용 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)
장고 관리자에서 등록하고 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']
이렇게하면 검색 필드가 기본 자리 표시자인 " 키워드 "와 함께 관리 목록 페이지에 나타납니다. 그러나 그 자리 표시자를 " 이름으로 검색 "으로 변경하려면 어떻게해야합니까?
사용자 정의 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', )
브라우저 디버그 도구 모음을 사용하여 장고가이 검색 창에 설정된 id 또는 클래스를 찾은 다음 js 코드를 작성할 수 있습니다.
$(function () {
$('#searchbar').attr('placeholder', 'Search by name')
})
또한 Media
클래스를 사용하면 사전 객체로 css 파일을 추가 할 수 있습니다.
class Media:
css = {
'all': ('css/admin/styles.css',)
}
예를 들어 first_name
열의 각 요소를 특정 색상으로 표시해야합니다.
기본적으로 Django는 list_display
모든 항목에 대해 테이블 열을 만들고, 모든 <td>
태그는 field-'list_display_name'
과 같은 CSS 클래스를 field_first_name
습니다.이 경우 field_first_name
.field_first_name {
background-color: #e6f2ff;
}
JS 또는 일부 CSS 스타일을 추가하여 다른 동작을 사용자 정의하려는 경우 브라우저 디버그 도구에서 id 및 요소 클래스를 항상 확인할 수 있습니다.
큰 테이블을 참조하는 외래 키 다루기
기본적으로 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