수색…


목록 변경

다음 모델을 가진 간단한 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_namelast_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> 필드 대신 자동 완성 필드를 사용할 수 있습니다.

django-autocomplete-light 예제

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
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow