2

Django管理者の特別なユースケースがいくつかありますが、他の人の意見に興味があります。

  1. 管理者がカスタマイズしたバージョンを使用して、ユーザーがサイト上の特定のオブジェクトを編集できるようにしたい(サイトの他の部分のように見えるようにカスタマイズした)。この時点で、ユーザーは自分が所有するオブジェクトのみを編集できますが、最終的には、任意のユーザーが任意のオブジェクトを編集できる、よりwikiスタイルの何かにこれを開きます。つまり、すべてのユーザーを「スタッフ」として指定し、それらのオブジェクトを編集する権限をユーザーに付与します。

  2. すべてのユーザーがすべてのオブジェクトを編集できるわけではない他のオブジェクトに対してもこれを行うことを検討していました。カスタムビューを使用して、ユーザーが自分のオブジェクトのみを編集するようにします。利点は、管理機能がすでに私が望むものにかなり近いので、ModelAdminでカスタマイズできる編集インターフェイスの開始点(管理者が自動的に作成するため)があることです。

最初の提案は受け入れられると考えられますが、2番目の提案は受け入れられないかもしれません。他のいくつかのリソース(django adminの有効なユースケース?とその質問のDjango Bookからの引用)を確認した後、一部のDjango開発者はこれが間違った考えだと感じているようです。

私の質問は:なぜですか?パフォーマンス、安定性、セキュリティ、使いやすさなどの観点から、カスタマイズされた管理ビューを使用してオブジェクトごとのアクセス許可を付与しない正当な理由はありますか?特定のアプリケーションの時間を大幅に節約できるように思えますが(とにかくやることになるかもしれません)、管理者と他のすべてのものをこのように区別する理由を理解したいと思いました。

4

3 に答える 3

4

あなたは好きなことを自由に行うことができます。Django管理者をカスタマイズしたい場合は、それを選択してください。ただし、通常の管理者変更パスから逸脱すると、メーリングリストとIRCで十分にサポートされない可能性があります。

管理者をカスタマイズすることは今のところ簡単な解決策のように思えるかもしれませんが、実際に物事の仕組みを微調整しようとすると、必要なフォームを自分で再作成するよりも多くの作業が必要になる可能性があります。一般的な作成/編集/削除および一般的な詳細/リストビューを調べます。これらは、必要な基本機能を非常に迅速に公開し、管理者よりも簡単に拡張できるようになります。

「管理者はあなたのアプリではない」という見方は、管理者をハックするよりも他のメカニズムを使用する方が簡単であるという事実から来ていると思います(さらに、管理者をそのままにしておくと、Django開発者の上位互換性がはるかに簡単になります)。

于 2009-10-21T01:30:13.153 に答える
2

私は以前、実際の管理コードを変更せずにdjangoアプリにこれを正確に実行させました。むしろ、クエリセットフィルターで拡張されたメソッドのいくつかを使用してadmin.ModelAdminのサブクラスを作成します。これにより、ユーザーが所有するレコードのみが表示されます(この場合、ビジネスはAUTH_PROFILE_MODELです)。これを実現する方法については、Web上にさまざまなブログがあります。

この手法を使用して、リストのフィルタリング、フォーム選択ボックス、保存を検証するフォームフィールドなどを使用できます。

これまでのところ、NFAから1.0、1.1まで存続していますが、このメソッドはAPIの変更の影響を受けやすくなっています。

実際には、アプリに新しいモデルを追加したので、新しいモデルの新しい行レベルのアクセスレベルの管理フォームを生成する方がはるかに速いことがわかりました。ユーザーfkを使用して新しいモデルを作成するか、AdminFilterByBusinessをサブクラス化するか、または単に

admin.site.register(NewModel,AdminFilterByBusiness)

カスタムが必要ない場合。それは動作し、非常に乾燥しています。

ただし、公開されている他のdjangoアプリを利用できないリスクがあります。したがって、構築するプロジェクトでは、この手法を慎重に検討してください。

http://code.djangoproject.co/wiki/NewformsHOWTOに触発された以下のフィルター管理クラスの例

#AdminFilterByBusiness {{{2
class AdminFilterByBusiness(admin.ModelAdmin):
    """
    Used By News Items to show only objects a business user is related to
    """
    def has_change_permission(self,request,obj=None):
        self.request = request

        if request.user.is_superuser:
            return True

        if obj == None:
            return  super(AdminFilterByBusiness,self).has_change_permission(request,obj)

        if obj.business.user == request.user:
            return True
        return False

    def has_delete_permission(self,request,obj=None):

        self.request = request

        if request.user.is_superuser:
            return True

        if obj == None:
            return  super(AdminFilterByBusiness,self).has_delete_permission(request,obj)

        if obj.business.user == request.user:
            return True
        return False

    def has_add_permission(self, request):

        self.request = request
        return super(AdminFilterByBusiness,self).has_add_permission(request)

    def queryset(self, request):
        # get the default queryset, pre-filter
        qs = super(AdminFilterByBusiness, self).queryset(request)
        #
        if not (request.user.is_superuser):
            # filter only shows blogs mapped to currently logged-in user
            try:
                qs = qs.filter(business=request.user.business_set.all()[0])
            except:
                raise ValueError('Operator has not been created. Please Contact Admins')
        return qs

    def formfield_for_dbfield(self, db_field, **kwargs):

        """ Fix drop down lists to populate as per user request """
        #regular return for superuser
        if self.request.user.is_superuser:
            return  super(AdminFilterByBusiness, self).formfield_for_dbfield(
                    db_field, **kwargs)

        if db_field.name == "business":
            return forms.ModelChoiceField(
                queryset = self.request.user.business_set.all()
               )

        #default
        return  super(AdminFilterByBusiness, self).formfield_for_dbfield(db_field, **kwargs)
于 2009-10-21T04:55:46.423 に答える
1

管理者とサポート担当者による「バックオフィス」アクセスのために、Django Admin(変更なし)を制限します。ユーザーや顧客によるものではありません。一部のスタイルシートは、サイトの他の部分と色を一致させるために変更されていますが、それだけです。

ユーザー(お客様)には、さまざまな取引を行うための適切なビュー機能を提供しています。高度に調整されたフォームを使用しても、チェックおよび制御する必要のあることがいくつかあります。

Djangoの更新トランザクションは非常に簡単に作成でき、adminをカスタマイズしようとすると、トランザクション自体を作成するよりも手間がかかるようです。

私たちのトランザクションは、 http://docs.djangoproject.com/en/dev/topics/forms/#using-a-form-in-a-viewに示されているほど複雑ではありません。

一般に、トランザクションを含むページには、ほとんどの場合、組み込みの管理インターフェースよりも少し複雑なワークフロー要素(または関連コンテンツ)が含まれています。ボイラープレートを超えて、半ダースほどの追加のコード行があります。

私たちのユースケースは単純な追加/変更/削除ではないため、デフォルトの管理アプリが提供するよりも多くの機能が必要です。

于 2009-10-21T10:19:55.213 に答える