문제

나는 최근에 사용하기 시작한 장고를 관리하는 대형 기존 응용 프로그램을 성장이 유기적으로 수년에 걸쳐 사용하여 꼬여 있습니다.웹.나는 실험을 시작으로 장고 그것은 자동적인 관리 인터페이스 그리고 나는 매우 기쁘게 생각합니다.

것 하나 없는 것에 대한 내 용을 제공하는 기능이 사용자가 읽기 데이터에 액세스할 수 있습니다.예를 들어 우리는 역할에 사람들이 허용하는 로그인을 만들이 구매 주문입니다.그들은 또한 필요를 볼 수 있지만 편집 다른 클라이언트 제품 또는 데이터입니다.

어떻게 내가 만드는"보기"사용 권한 장고 관리하므로 사용자 수정할 수 있는 데이터에 대한 일부 테이블을 갖는 동안,읽기만 다른 사람에 대한 액세스?

업데이트:장고 관리자가 제게 복잡한 시스템을 구축의 CRUD 인터페이스입니다.내가 어떻게 읽기만 일부분으로 연결된 사용 권한 및 그룹?

업데이트 2010-Feb-12:Django1.2 이 포함됩니다 읽기 전용입니다.아래에 정보.


내가 대답하되 나 자신의 질문에 나는 생각한다.이동하는 콘텐츠를 실시오.

도움이 되었습니까?

해결책 5

관리자보기에 읽기 전용 필드를 추가하는 기능은 이제 Django 버전 1.2에 포함되어 있습니다.

티켓 번호 342를 참조하십시오http://code.djangoproject.com/ticket/342

변경 사항 번호 11965를 참조하십시오http://code.djangoproject.com/changeset/11965

문서를 참조하십시오http://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.modeladmin.readonly_fields

다른 팁

이것은 어떻게 변화 장고 1.0.2 를 추가하는'보기'권한이 있습니다.죄송이 없을 비교 가능합니다.

[X]1.추가되는'보기'기본값으로 사용 권한 목록

#./contrib/auth/management/__init__.py
def _get_all_permissions(opts):
    "Returns (codename, name) for all permissions in the given opts."
    perms = []
    for action in ('add', 'change', 'delete', 'view'):
        perms.append((_get_permission_codename(action, opts), u'Can %s %s' % (action, opts.verbose_name_raw)))
    return perms + list(opts.permissions)

[X]2.테스트는 보기 권한이 추가되는 모든 모델

run manage.py syncdb

나는 확인되는 보기 권한은 지금에 추가한 모든 테이블에서 auth_permissions 테이블

[X]3.추가"get_view_permission"기본 모델 클래스입니다.

추가 get_view_permission 모델 클래스입니다.찾을 수 있습니다 이 파일에서./db/models/options.py 이것은 사용에 의해 관리 클래스에는 다음 단계입니다.

def get_view_permission(self):
    return 'view_%s' % self.object_name.lower()

[X]4.추가"has_view_permission"기본값으로 관리 클래스

다만 나는 추가"has_view_permission"하는 시스템입니다.그것처럼 보인다 contrib/admin/options.py.만든 사용자가 가지고 있는 경우는 변경 권한,그 보기 권한이 자동으로 묵시적으로 사용됩니다.

# /contrib/admin/options.py
# Added has_view_permissions
def has_view_permission(self, request, obj=None):
    """
    Returns True if the given request has permission to change or view
    the given Django model instance.

    If `obj` is None, this should return True if the given request has
    permission to change *any* object of the given type.
    """
    opts = self.opts
    return self.has_change_permission(request, obj) or \
        request.user.has_perm(opts.app_label + '.' + opts.get_view_permission())

# modified get_model_perms to include 'view' too.
# No idea where this may be used, but trying to stay consistent
def get_model_perms(self, request):
        """
        Returns a dict of all perms for this model. This dict has the keys
        ``add``, ``change``, and ``delete`` and ``view`` mapping to the True/False
        for each of those actions.
        """
        return {
            'add': self.has_add_permission(request),
            'change': self.has_change_permission(request),
            'delete': self.has_delete_permission(request),
            'view': self.has_view_permission(request),
        }

# modified response_add function to return the user to the mode list
# if they added a unit and have view rights
... 
    else:
        self.message_user(request, msg)

        # Figure out where to redirect. If the user has change permission,
        # redirect to the change-list page for this object. Otherwise,
        # redirect to the admin index.
        #if self.has_change_permission(request, None):
        if self.has_change_permission(request, None) or self.has_view_permission(request, None):
            post_url = '../'
        else:
            post_url = '../../../'
        return HttpResponseRedirect(post_url)

 # modified the change_view function so it becomes the details 
 # for users with view permission

    #if not self.has_change_permission(request, obj):
    if not (self.has_change_permission(request, obj) or (self.has_view_permission(request, obj) and not request.POST)):
        raise PermissionDenied


  # modified the changelist_view function so it shows the list of items
  # if you have view permissions
def changelist_view(self, request, extra_context=None):
    "The 'change list' admin view for this model."
    from django.contrib.admin.views.main import ChangeList, ERROR_FLAG
    opts = self.model._meta
    app_label = opts.app_label
    #if not self.has_change_permission(request, None):
    if not (self.has_change_permission(request, None) or self.has_view_permission(request, None)):
        raise PermissionDenied

[X]5.업데이트를 기본 템플릿은 모델을 나열하는 경우 사용자는 보기 권한

나는 수정된 기본에서는 템플릿 contrib/admin/templates/admin/index.html.수도 처리할 파일을 복사하여 지역 templates 디렉토리에 대신 합니다.을 변경했는데 모두가 복사본을 경우 후 업그레이드를 덮어쓰 나의 변경합니다.

 {% for model in app.models %}
            <tr>
            {% if model.perms.change %}
                <th scope="row"><a href="{{ model.admin_url }}">{{ model.name }}</a></th>
            {% else %}
                {% if model.perms.view %}
                    <th scope="row"><a href="{{ model.admin_url }}">{{ model.name }}</a></th>
                {% else %}
                    <th scope="row">{{ model.name }}</th>
                {% endif %}
            {% endif %}

[X]6.인 사용할 수 있는'보기'하지만 변경""모델

발견 contrib/admin/templatetags/admin_modify.py 가 나타납하 제어 저장/저장하고 계속 버튼이 나타나나지 않습니다.변경"저장"란에서 기본값은 항상 사실을 확인하는 컨텍스트와 권한이 있습니다.사용자가 있는 경우는 변경하거나 추가할 권한이 있습니다.

 'show_save': (change and context['has_change_permission']) or (context['add'] and context['has_add_permission'])

[X]7.을 제거하"저장하고 다른 추가"버튼을 경우에는 사용자가 확인할 수 있게 되었습니다.

Modified contrib/admin/templatetags/admin_modify.py 다시합니다.I don't know what'save_as'의 그래서 어쩌면 나는 뭔가 하지만 그것은 작동하는 것 같다.

    #'show_save_and_add_another': context['has_add_permission'] and
    #                    not is_popup and (not save_as or context['add']) ,
    'show_save_and_add_another': not is_popup and
        (( change and context['has_change_permission']) or (context['add'] and context['has_add_permission']))
        and
        (not save_as or context['add']),

[X]8.수정하는"보기"사용 권한을 형태로만 읽

는 경우에는 사용자가"보기를 권한"및"변경"사용 권한,그 후 아무것도 할 수 없습니다.변경 재정 보기.

는 경우에는 사용자가"보기"사용 권한 없이 변경""그때 기본값을 변경한 형태와 추가 비활성화 또는 읽기 전용 특성과 형태 요소입니다.모든 브라우저가 지원이지만,나의 목적을 위해 내가 필요할 수 있는 사용자가 사용합니다. 장애인/예 Readonly

는 것을 발견하지 않는 모든 브라우저 명예"readonly"그래서 그것은 세트의 일부 컨트롤라이언,다른 사람을 사용할 수 없습니다.이를 통해 사용자 데이터를 복사한 텍스트 컨트롤하는 경우 필요합니다.

#/django/contrib/admin/templates/admin/change_form.html

{# JavaScript for prepopulated fields #}
{% prepopulated_fields_js %}

</div>
</form></div>
{% if has_view_permission and not has_change_permission %}
    <script type="text/javascript">
    jQuery('input:text').attr('readonly', 'readonly');
    jQuery('textarea').attr('readonly', 'readonly');
    jQuery('input:checkbox').attr('disabled', true);
    jQuery('select').attr('disabled', true);
    jQuery('.add-another').hide();
    </script>
{% endif %}

이 스 니펫은 슈퍼 어우저가 쓰기 액세스가있는 유일한 사람으로 만듭니다.

class AdminOwn(admin.ModelAdmin):
    def get_readonly_fields(self, request, obj=None):
        if request.user.is_superuser:
            return self.readonly_fields
        #get all fields as readonly
        fields = [f.name for f in self.model._meta.fields]
        return fields

관리자 안에 있습니다. 관리자의 사용자 및 그룹에 대한 권한을 설정하여 특정 모델을 추가, 변경 및 삭제할 수 있습니다.

업데이트: 죄송합니다. "읽기 전용"보다는 장고의 의미를 부여하기 위해 단어보기를 잘못 해석했기 때문에이 질문을 잘못 이해했습니다. 관리자를 사용하여 읽기 전용을 원한다면 약간의 작업을 수행해야한다고 생각합니다. 보다 이 스레드, James Bennett (Django Release Manager)가 말합니다.

이 목록의 아카이브를 검색하여 찾은 것처럼 Django Admin 인터페이스가 지원하도록 설계된 것이 아니므로 모든 솔루션은 전적으로 자신의 코드를 작성해야합니다.

그리고

Django 관리자는 "Add", "Change"및 "Delete"의 세 가지 권한으로 작동합니다. "보기는 없지만 수정되지 않음"권한이 없으므로 중요한 사용자 정의 코딩을하지 않고도 그러한 제한을 적용 할 수있는 방법이 없습니다.

추가 작업에는 특정 모델에 대한 "Readonly"권한을 추가하고 기본 관리자 템플릿을 변경하여 사용자가 해당 권한이 있는지 확인하고 특정 컨트롤 (예 : 저장 버튼)을 비활성화하고 다른 사람을 읽을 수 있도록합니다. . 이는 캐주얼 땜질을 방해 할 것이지만, 서버 측로 로직을 수정하여 동일한 권한을 확인하여 권한을 우회하기 위해 교활한 방식으로 작성된 게시물을 피해야 할 수도 있습니다.

모델에서 "Readonly"권한을 작성하고 수정과 함께 Jasuca 코드를 사용할 수 있습니다.

Models.py :

class MyModel(models.Model):
    name = models.CharField(max_length=100)
    description = models.CharField(max_length=256, null=True, blank=True)

    class Meta:
        permissions = (
            ('readonly_mymodel','Readonly MyModel'),
        )

admin.py :

class MyModelAdmin(admin.ModelAdmin):
    def get_readonly_fields(self, request, obj=None):
        if not request.user.is_superuser and request.user.has_perm('mymodel.readonly_mymodel'):
            return [f.name for f in self.model._meta.fields]
        return self.readonly_fields

INSPLATION의 관리자에서는 사용자에게 "변경"및 "ReadOnly"의 허가를 받아야합니다.

인증 모듈에서 그룹을 만들 수 있습니다. 그런 다음 사용자 그룹 로그인을 기반으로 admin.py에서 ModelAdmin의 readonly_fields 속성을 설정하십시오. 메소드 def has_add_permission (self, request)을 추가하여 Reshonly 권한이있는 그룹의 False를 반환합니다. ADD를 제공하고 그룹에 권한을 수정하십시오. 그들은 모델 속성 만 읽을 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top