django 1.8 공식 문서 번역: 7-2 관리 작업

9660 단어
관리 작업
간단하게 말하면 Django가 백그라운드를 관리하는 기본 절차는'한 대상을 선택하고 그것을 바꾸는 것이다'는 것이다.대다수 상황에서 이것은 매우 적합하다.그러나 한 번에 여러 대상에 대해 똑같은 변화를 하려면 이 절차는 매우 단조롭고 무미건조하다.
이 예에서 Django 관리 백엔드는 '조작' 을 실행하고 등록할 수 있습니다. 선택한 대상을 매개 변수로 집합하는 리셋 함수일 뿐입니다.
이러한 예는 Django 자체 관리 페이지에서 볼 수 있습니다.Django는 모든 모델에서 선택한 객체 삭제 작업을 수행합니다.예를 들어, Django's에서 django.contrib.auth 앱이 만든 사용자 모델은 다음과 같습니다.
경고
'선택한 대상 삭제'작업은 성능 요인으로 인해 QuerySet.delete()을 사용했습니다. 여기에 추가 설명이 있습니다. 이것은 당신의 모델의 delete() 방법을 사용하지 않습니다.
이 동작을 덮어쓰고 싶으면 사용자 정의 동작을 작성하고 삭제하면 됩니다. 예를 들어 선택한 요소마다 Model.delete()을 호출하십시오.
전체 삭제에 대한 자세한 내용은 참조객체 삭제를 참고하십시오.
목록에 자신의 동작을 추가하는 방법을 알아보기 위해 계속 읽어라.
작성 작업
예시를 통해 조작이 가장 간단하다는 것을 설명하고 시작합시다.
조작의 가장 보편적인 용례는 모델의 전체적인 갱신이다.Article 모델의 간단한 뉴스 응용을 고려한다.
from django.db import models

STATUS_CHOICES = (
    ('d', 'Draft'),
    ('p', 'Published'),
    ('w', 'Withdrawn'),
)

class Article(models.Model):
    title = models.CharField(max_length=100)
    body = models.TextField()
    status = models.CharField(max_length=1, choices=STATUS_CHOICES)

    def __str__(self):              # __unicode__ on Python 2
        return self.title

우리가 모델에서 수행할 수 있는 보편적인 임무는 글의 상태를 '초고' 에서 '발표된 것' 으로 업데이트하는 것이다.우리는 무대 뒤에서 한 번에 한 편의 문장을 처리하는 것은 매우 쉽지만, 만약 우리가 대량으로 문장을 발표하려고 한다면 매우 번거로울 것이다.그래서 우리는 한 문장의 상태를 '발표된 것' 으로 수정할 수 있는 조작을 만듭니다.
조작 함수 작성
우선, 백엔드 조작이 터치될 때 호출되는 함수를 정의해야 한다.일반 함수와 마찬가지로 세 개의 매개변수를 수신해야 합니다.
  • 현재 ModelAdmin
  • 은 현재 요청된 HttpRequest
  • 을 나타냅니다.
  • 사용자가 선택한 객체 컬렉션을 포함하는 QuerySet
  • 이 기사를 게시하는 데 사용되는 함수는 ModelAdmin이나 요청 대상이 필요하지 않지만, 조회 집합을 사용합니다.
    def make_published(modeladmin, request, queryset):
        queryset.update(status='p')
    

    주의
    성능이 가장 우수하기 위해, 우리는 조회 집합의 을 사용한다업데이트 방법.다른 유형의 작업은 각 객체를 개별적으로 처리해야 할 수 있습니다.이 경우 질의 세트를 반복해야 합니다.
    for obj in queryset:
        do_something_with(obj)
    

    작성 작업의 전체 내용이 실제로는 이렇게 많다.그러나 우리는 선택할 수 있지만 유용한 절차를 진행하여 백엔드에서 조작에'굉장한'제목을 붙여야 한다.일반적으로 작업은 작업 목록에 "Make published"방식으로 나타납니다. 모든 공백이 밑줄로 바뀐 함수 이름입니다.이렇게 하면 좋지만 우리는 더욱 좋고 인성화된 명칭을 제공할 수 있다. make_published 함수에 short_description 속성을 추가할 수 있다.
    def make_published(modeladmin, request, queryset):
        queryset.update(status='p')
    make_published.short_description = "Mark selected stories as published"
    

    주의
    이것은 좀 익숙해 보일 수도 있다.admin의 list_display 옵션은 같은 기교를 사용하여 여기에 등록된 리셋 함수를 인류가 읽을 수 있는 설명을 제공합니다.ModelAdmin에 작업 추가
    다음에 우리는 조작을 ModelAdmin에게 알려야 한다.그것은 다른 설정 항목의 작업 방식과 같다.운영 및 등록이 모두 포함된 admin.py은 다음과 같이 보입니다.
    from django.contrib import admin
    from myapp.models import Article
    
    def make_published(modeladmin, request, queryset):
        queryset.update(status='p')
    make_published.short_description = "Mark selected stories as published"
    
    class ArticleAdmin(admin.ModelAdmin):
        list_display = ['title', 'status']
        ordering = ['title']
        actions = [make_published]
    
    admin.site.register(Article, ArticleAdmin)
    

    이 코드는 다음과 같이 admin의 변경 목록을 제공합니다.
    그게 전부야.만약 네가 자신의 조작을 작성하고 싶다면, 너는 지금 어떻게 시작하는지 알아야 한다.이 문서의 나머지 부분은 더 많은 고급 기교를 소개할 것이다.
    작업 중 오류 처리
    만약 당신이 작업을 실행할 때 오류가 발생할 수 있음을 예견한다면, 사용자에게 우아한 방식으로 이 오류를 통지해야 합니다.즉, 이상 처리와 사용 django.contrib.admin.ModelAdmin.message_user()은 응답에서 사용자의 우호적인 문제 설명을 보여줄 수 있다.
    조작의 고급 기교
    진일보한 선택에 대해 너는 약간의 추가 옵션을 사용할 수 있다.
    ModelAdmin의 작업 ModelAdmin위의 예는 간단한 함수로 정의된 make_published 조작을 보여 준다.이것은 정말 좋은 것이다. 그러나 보기의 코드 디자인 측면에서 볼 때 이것은 완벽하지 않다. 조작은 Article과 밀접하게 결합되기 때문에 조작을 ArticleAdmin 대상에 직접 연결하는 것이 더 의미가 있다.
    이렇게 하면 매우 간단하다.
    class ArticleAdmin(admin.ModelAdmin):
        ...
    
        actions = ['make_published']
    
        def make_published(self, request, queryset):
            queryset.update(status='p')
        make_published.short_description = "Mark selected stories as published"
    

    우선 make_published을 한 방법에 넣고 modeladminself으로 이름을 바꿨습니다. 그 다음에 우리는 현재 'make_published' 문자열을 직접적인 함수 인용이 아닌 actions에 넣었습니다.이렇게 하면 ModelAdmin이 이 조작을 방법으로 간주할 수 있다.
    조작을 방법으로 정의하면 조작이 더욱 직접적이고 언어 습관에 부합되는 방식으로 ModelAdmin에 접근하고 모든admin이 제공하는 방법을 호출할 수 있다.
    예를 들어, self을 사용하여 사용자가 작업에 성공했음을 알리는 메시지를 보낼 수 있습니다.
    class ArticleAdmin(admin.ModelAdmin):
        ...
    
        def make_published(self, request, queryset):
            rows_updated = queryset.update(status='p')
            if rows_updated == 1:
                message_bit = "1 story was"
            else:
                message_bit = "%s stories were" % rows_updated
            self.message_user(request, "%s successfully marked as published." % message_bit)
    

    이렇게 하면 작업이 성공적으로 수행된 후 백그라운드에서 수행된 작업과 동작이 일치합니다.
    중간 페이지에 대한 작업 제공
    일반적으로, 작업을 실행한 후, 사용자는 간단하게 방향을 바꾸어 이전의 수정 목록 페이지로 돌아갑니다.그러나 일부 작업, 특히 더 복잡한 작업은 중간 페이지로 돌아가야 한다.예를 들어 내장된 삭제 작업은 선택한 대상을 삭제하기 전에 사용자에게 문의해서 확인해야 한다.
    중간 페이지를 제공하려면 HttpResponse (또는 하위 클래스) 으로 돌아가면 됩니다.예를 들어, Django의 를 사용한 간단한 내보내기 함수를 작성했을 수 있습니다.서열화 함수선택한 객체 중 일부를 JSON으로 변환하려면 다음과 같이 하십시오.
    from django.http import HttpResponse
    from django.core import serializers
    
    def export_as_json(modeladmin, request, queryset):
        response = HttpResponse(content_type="application/json")
        serializers.serialize("json", queryset, stream=response)
        return response
    

    일반적으로 위의 코드의 실현 방식은 결코 좋지 않다.대부분의 경우, 가장 좋은 실천은 HttpResponseRedirect을 되돌려주고, 사용자가 작성한 보기로 방향을 바꾸어 GET 검색 문자열에 선택한 대상의 목록을 전달하는 것이다.이것은 네가 중간 인터페이스에서 복잡한 상호작용 논리를 제공해야 한다.예를 들어, 더 복잡한 내보내기 함수를 제공하려면, 사용자가 형식을 선택하고, 내보내기에 필드가 포함된 목록을 포함하기를 원할 것이다.가장 좋은 방법은 사용자 정의 내보내기 보기로 간단하게 방향을 바꾸는 작은 조작을 작성하는 것입니다.
    from django.contrib import admin
    from django.contrib.contenttypes.models import ContentType
    from django.http import HttpResponseRedirect
    
    def export_selected_objects(modeladmin, request, queryset):
        selected = request.POST.getlist(admin.ACTION_CHECKBOX_NAME)
        ct = ContentType.objects.get_for_model(queryset.model)
        return HttpResponseRedirect("/export/?ct=%s&ids=%s" % (ct.pk, ",".join(selected)))
    

    보시다시피 이 조작은 가장 간단한 부분입니다.모든 복잡한 논리는 당신의 내보내기 보기 안에 있습니다.이것은 모든 유형의 대상을 처리해야 하기 때문에 ContentType을 처리해야 한다.
    이 보기의 편찬은 하나의 연습으로 독자에게 남겨진다.
    사이트 전체에 작업 적용AdminSite. `add_action`(_action_[, _name_])
    만약 일부 조작이 관리 사이트의모든객체를 모두 사용할 수 있다면 매우 좋습니다. 위에서 정의한 내보내기 동작은 좋은 예비 방안입니다.너는 AdminSite.add_action()을 사용하여 전체 국면에서 하나의 조작을 사용할 수 있다.예를 들면 다음과 같습니다.
    from django.contrib import admin
    
    admin.site.add_action(export_selected_objects)
    

    이렇게 하면 export_selected_objects 작업은 전역에서 사용할 수 있으며 이름은'export selected objects'입니다.너도 동작의 이름을 명시적으로 지정할 수 있다. - 프로그래밍을 하고 싶다면이 작업 제거 –AdminSite.add_action()에 두 번째 매개변수를 전달합니다.
    admin.site.add_action(export_selected_objects, 'export_selected')
    

    작업 비활성화
    특정 조작을 금지해야 할 때가 있다--특히등록된 사이트 수준 작업 -특정 객체의 경우몇 가지 방법을 사용하여 작업을 비활성화할 수 있습니다.
    전체 사이트 작업 비활성화AdminSite. `disable_action`(_name_)
    만약 사용하지 않으려면사이트 레벨 작업,너는 AdminSite.disable_action()을 호출할 수 있다.
    예를 들어, 이 방법을 사용하여 내장된 선택된 객체 삭제 작업을 제거할 수 있습니다.
    admin.site.disable_action('delete_selected')
    

    일단 위의 코드를 실행하면, 이 조작은 전체 사이트에서 사용할 수 없습니다.
    그러나 특정 모델을 전역적으로 비활성화된 대상에 다시 시작하려면 ModelAdmin.actions 목록에 명시적으로 놓으면 됩니다.
    # Globally disable delete selected
    admin.site.disable_action('delete_selected')
    
    # This ModelAdmin will not have delete_selected available
    class SomeModelAdmin(admin.ModelAdmin):
        actions = ['some_other_action']
        ...
    
    # This one will
    class AnotherModelAdmin(admin.ModelAdmin):
        actions = ['delete_selected', 'a_third_action']
        ...
    

    특정 ModelAdmin에 대해 모든 작업 비활성화 ModelAdmin하면, 만약, 만약...제거제공된 ModelAdmin의 모든 작업은 ModelAdmin.actionsNone으로 설정할 수 있습니다.
    class MyModelAdmin(admin.ModelAdmin):
        actions = None
    

    이렇게 하면 ModelAdmin에게 어떤 조작도 보여주거나 허용하지 말라고 알릴 것이다.사이트 수준 작업.
    필요 시 작업 활성화 또는 비활성화ModelAdmin. `get_actions`(_request_)
    마지막으로, 당신은 ModelAdmin.get_actions()을 덮어써서, 모든 요청 (사용자마다) 을 필요에 따라 열거나 비활성화할 수 있습니다.
    이 함수는 조작을 허용하는 사전을 되돌려줍니다.사전의 키는 조작의 이름이고 값은 (function, name, short_description) 모듈이다.
    대부분의 경우, 당신은 필요에 따라 이 방법을 사용하여 슈퍼클래스의 목록에서 작업을 제거할 것이다.예를 들어, 이름이'J'로 시작하는 사용자만 객체를 대량 삭제할 수 있도록 하려면 다음 코드를 실행할 수 있습니다.
    class MyModelAdmin(admin.ModelAdmin):
        ...
    
        def get_actions(self, request):
            actions = super(MyModelAdmin, self).get_actions(request)
            if request.user.username[0].upper() != 'J':
                if 'delete_selected' in actions:
                    del actions['delete_selected']
            return actions
    

    번역자: Django 문서 공동 번역 팀, 원문: Admin actions.
    본고는 CC BY-NC-SA 3.0 프로토콜로 발표되었으며 전재는 작가의 서명과 글의 출처를 보존해 주십시오.
    Django 문서 협동 번역팀은 일손이 부족해서 관심 있는 친구가 우리에 가입할 수 있습니다. 완전 공익적입니다.교류군: 467338606.

    좋은 웹페이지 즐겨찾기