django admin site常用関数(formfield_for_foreignkey,queryset,get_readonly_fields)

2698 ワード

djangoに接触して長い間感じましたが、djangoは複雑で柔軟なwebフレームワークで、フレームワークはpython言語を使っているので、国内では比較的小さな言語とフレームワークです.
djangoを知っている人は、djangoのadminサイト管理システムを知っているはずです.柔軟な応用ができれば、プロジェクトの開発段階で、彼は多くのバックグラウンドのことを処理して、あなたの開発作業を余裕を持っています.
admin基礎の使い方はここでは言わないが,ここではいくつかのよく使われる関数を重点的に強調し,これらの関数はadminで使用される頻度が比較的高い.
1.formfield_for_foreignkey(self, db_field, request, **kwargs)
The formfield_for_foreignkey method on a ModelAdmin allows you to override the default formfield for a foreign keys field. For example, to return a subset of objects for this foreign key field based on the user:
私は英語があまり上手ではありません.例を見てください.
    def formfield_for_foreignkey(self, db_field, request, **kwargs):
        if not request.user.is_superuser:
            if db_field.name == "catagory":
                shop=Shop.objects.get(username=request.user.username)
                kwargs["queryset"] = Catagory.objects.filter(shop=shop)
        else:
            kwargs["queryset"] =Catagory.objects.all()
        return super(GoodsAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)

ここでは
formfield_for_foreignkeyメソッドは、GoodsAdminでCategoryをフィルタリングすることを実現することができ、(CategoryはGoodsAdminの外部キーである)、すなわちユーザがスーパーユーザでない場合、現在登録されているユーザの店舗のカテゴリのみを表示し、商品を追加すると、他の店舗のカテゴリに商品を追加することはない.
2.queryset(self, request)
The queryset method on a ModelAdmin returns a QuerySet of all model instances that can be edited by the admin site. One use case for overriding this method is to show objects owned by the logged-in user
    def queryset(self, request):
        qs = super(ShopAdmin, self).queryset(request)
        if request.user.is_superuser:
            return qs
        return qs.filter(username=request.user.username,boss_verified=True)

ここのquerysetの方法は、現在ログインしているユーザーの店舗のみを表示し、スーパー管理者の場合はすべての店舗を表示します.フィルタクエリーでもありますが、外部キーをフィルタするのではなく、条件フィルタです.
3.get_readonly_fields(self, request,obj=None)
The get_readonly_fields method is given the HttpRequest and the obj being edited (or None on an add form) and is expected to return a list or tuple of field names that will be displayed as read-only, as described above in the ModelAdmin.readonly_fields section
    def get_readonly_fields(self, request,obj=None):
        fields=[]
        if request.user.is_superuser:
            return fields
        else:
            fields=['boss_verified','deliver_during']
            return fields
この方法は、ログインユーザがスーパーユーザでない場合、このadminのboss_を指す.verified ,deliver_duringの2つのフィールドは編集できません.読み取り専用です.
adminの他の関数についてはdjangoの公式ドキュメントが紹介されていますが、英語のドキュメントばかりで、事例がないものもあるので、勉強の難しさが増しています.本人は時間があれば一つ一つ紹介します.