2012-03-30 3 views
1

Djangoアプリケーションのすべてのモデルにcan_viewメタアクセス許可を追加します。DjangoアプリケーションのすべてのモデルにMetaパーミッションを適用する方法はありますか?

はかなり私はself.verbose_nameは、この場合であってもそのように動作するかどう....

が可能、このされてもわからないんだけどmodels.py

class Meta: 
    permissions = [ ("can_view", "Can view {something}".format(something = self.verbose_name) ] 

内のすべてのクラスにこれを追加します?

ボーナスに関する質問:モデルのMetaのパーミッションを追加したら、私はhas_permと呼ぶことができますか?同様に

if request.user.has_perm('polls.can_view') : 
    # Show a list of polls. 
else : 
    # Say "Insufficient permissions" or something.  
+1

私は自分自身を疑問に思っていましたが、最終的にはdetailviewを持つモデルはほんの一握りでしたので、すべてのモデルで表示権限を有効にしようとしなかったのです。しかし、私は、detailviewがたくさんあるプロジェクトでは、一つずつそれを行うのが面倒かもしれないことを理解しています。一方、私は許可のチェックから継承するベースビュークラスを作成しました:https://gist.github.com/97b3a0f17aa6e4d35da8ので、役立つかもしれません。あなたがdjango-guardianを使用しないなら、あなたはそれを簡単に適応させることができます。また、言語であなたの質問にタグを付けることを忘れないでください(私はPythonタグを追加しました) – jpic

+0

@jpic Djangoがデフォルトの権限の1つとして 'can_view'を使用していないのはなぜかと思いました。まあ、これらの権限が必要な5つのモデルしかありません。多分私はDjangoの 'models.Model'クラスをオーバーライドできますか?それはおそらくそれの価値はありません。ちなみに、過去2ヶ月間Djangoで私を助けてくれてありがとう。あなたは私のプライベート・メンターのようです:-)。私の質問や何かを定期的にチェックしていますか? – hobbes3

答えて

5

許可はちょうど普通のDjangoモデルインスタンスでもあります。他のモデルと同様に作成できます。

だからあなたはあなたが一度それを実行する必要があり、そうpost_syncdb信号はそのための良い場所のように見えます

from django.contrib.auth.models import Permission 
from django.contrib.contenttypes.models import ContentType 

for content_type in ContentType.objects.all(): 
    Permission.objects.create(content_type=content_type, codename='view_%s' % content_type.model, name='Can view %s' % content_type.name) 

ようなものが必要。

+2

私はこれ以上鉱山が好きです –

+0

このコードはどこに置くべきですか? 'post_syncdb'シグナルコードはどこに置くべきですか? – hobbes3

+0

@ hobbes3 https://docs.djangoproject。com/en/dev/topics/signals/ – DrTyrsa

1

最も単純で明白なアプローチは、すべてのモデルの親であるカスタムベースモデルです。あなた(または別のプログラマー)がcan_viewのどこから来ているのか疑問に思うでしょう。

class CustomBaseModel(models.Model): 
    class Meta: 
     abstract = True 
     permissions = [ ("can_view", "Can view {something}".format(something = self.verbose_name) ] 

class SomeModel(CustomBaseModel): 
    # ... 

しかし、これはすべてのあなたのモデルを変更する必要があります(これは簡単に少し検索&で行われ置き換え)、それは(Userなど)Djangos組み込みモデルを変更しません。

+0

これは 'NameError:name 'self' not defined 'を引き起こします。 – DrTyrsa

+0

どのようにして' can_view'を 'User'に追加しますか?私はこれがPythonの質問の多くであると思います。クラスを継承し拡張する方法は分かっていますが、それは別の名前になります。これらの組み込みのDjangoクラスを置き換えて拡張し、同じ名前を保持するには(ソースコードを変更せずに)どうすればよいですか? Djangoの管理ページをあなたのテンプレートで上書きしてカスタマイズするのが好きです。 – hobbes3

+0

あるいは 'Can_view'を' UserProfile'に適用する必要がありますか?いずれにしても、私の質問はPythonの観点からではなく、Djangoからのものでしたので、私は仮説的な問題に対する解決策を知りたいと思っています。 – hobbes3

関連する問題