11

プライマリ管理サイトの機能のサブセットを提供する 2 つ目の管理サイトを実装したいと考えています。それは可能であり、Django docsで説明されています

ただし、プライマリ管理サイトへのアクセスを制限したいと考えています。一部のユーザーは、2 次サイトにはアクセスできますが、1 次サイトにはアクセスできません。

その機能を実装するには、これらのユーザーをスタッフに含めないようにして (is_staff=False)、AdminSite.has_permission

class SecondaryAdminSite(AdminSite):
    
    def has_permission(self, request):
        if request.user.is_anonymous:
            try:
                username = request.POST['username']
                password = request.POST['password']
            except KeyError:
                return False
            try:
                user = User.objects.get(username = username)
                if user.check_password(password):
                    return user.has_perm('app.change_onlythistable')
                else:
                    return False
            except User.DoesNotExist:
                return False
        else:
            return request.user.has_perm('app.change_onlythistable')

残念ながら、このアプローチは機能しません。ユーザーはログインできますが、セカンダリ管理サイトには何も表示されません。

このアプローチの何が問題なのですか? この機能を実装する方法はありますか?

前もって感謝します

4

3 に答える 3

4

あなたのアプローチが可能になったと思います:http: //code.djangoproject.com/ticket/14434(5週間前に閉鎖)

ただし、明示的な「is_staff」チェックは引き続き 2 つの場所で行われます (staff_member_required デコレーターを除く)。

  • django.contrib.admin.forms.AdminAuthenticationForm.clean()

    「has_permission()」に加えて、非スタッフ AdminSite に is_staff チェックを行わない「login_form」を提供する必要があるため、それに応じてサブクラス化して clean() を調整することができます。

  • テンプレート/管理者/base.html

    少しカスタマイズする必要があります。ID「user-tools」の div は、アクティブなスタッフ メンバーに対してのみ表示されます。ログインフォームもこのテンプレートを使用しており、誰かがアクティブなスタッフ以外のメンバーとしてログインしている可能性があるため、これは完了していると思いますが、それでもそれらのリンクは表示されません。

于 2011-04-06T22:21:13.867 に答える
3

これが私のために働いたものですDjango >= 3.2

  • のサブクラスを作成しますAdminSite
  • メソッドをオーバーライドして、チェックhas_permission()を削除します。is_staff
  • をオーバーライドしlogin_formて使用しますAuthenticationForm
    • AdminSiteを使用して、 のチェックAdminAuthenticationFormを拡張および追加します。AuthenticationFormis_staff

コード

# PROJECT/APP/admin.py

from django.contrib.admin import AdminSite
from django.contrib.admin.forms import AuthenticationForm


class MyAdminSite(AdminSite):
    """
    App-specific admin site implementation
    """

    login_form = AuthenticationForm

    site_header = 'Todomon'

    def has_permission(self, request):
        """
        Checks if the current user has access.
        """
        return request.user.is_active


site = MyAdminSite(name='myadmin')

于 2021-05-22T16:24:00.090 に答える
-1

このアプローチの何が問題なのですか? この機能を実装する方法はありますか?

このアプローチの問題点は、パーミッションとグループが既に必要なものを提供できることです。ユーザーを分割するだけであれば、AdminSite をサブクラス化する必要はありません。

これがおそらく、この機能の文書化が不十分な理由です。

于 2010-12-01T23:14:10.420 に答える