プロキシモデルを使用して編集インターフェイスを制限する

djangoの管理インターフェースでは、さまざまなアプリケーションのオブジェクトへのアクセス権を設定できます。 どのアプリケーションのどのモデルでも、ユーザーに3つのアクションを許可できます。新しいオブジェクトの追加、既存のオブジェクトの編集と削除です。



しかし、ユーザーがフィールドの一部のみを編集できるようにしたい場合はどうでしょうか? 同時に、他のユーザーがすべてのフィールドを編集できるようにしてください。



プロキシモデルが役立ちます。 jangoの用語では、プロキシモデルは、通常のモデルのインターフェイスを持つオブジェクトですが、データベースに関連付けられているのではなく、別のモデルのデータに関連付けられています。 これは何のためですか?



djangoのドキュメントでは次の例を使用しています。 auth.User



モデルauth.User



追加のメソッドが必要です。 これを行うには、 auth.User



モデルに基づいてプロキシモデルを作成し、 auth.User



このメソッドを説明し、必要に応じて元のプロキシモデルの代わりにこのプロキシモデルを使用します。



タスクに戻りましょう。 プロキシモデルは、ユーザーが元のモデルを操作できないようにし、プロキシモデルへのアクセスを許可し、許可されたフィールドのみが利用できるように編集フォームを構成できるという点で便利です。



次のモデルがあると想像してみましょう。



 class Article(models.Model): title = models.CharField(...) body = models.CharField(...) tags = models.CharField(...)
      
      







エディターが管理パネルに移動し、記事のリストを表示し、タグを変更できるようにしたいが、記事のタイトルや本文を変更することはできません。



手始めにプロキシモデルを作成しましょう。



 class ArticleEditProxy(Article): class Meta: proxy = True
      
      







このモデルをadmin.site



登録し、タグのみが編集に使用できる特別なフォームを割り当てます



 class ArticleEditProxyForm(forms.ModelForm): class Meta: model = ArticleEditProxy fields = ['tags'] class ArticleEditProxyAdmin(admin.ModelAdmin): list_display = ['title', 'tags'] form = ArticleEditProxyForm readonly_fields = ['title', 'body'] admin.site.register(ArticleEditProxy, ArticleEditProxyAdmin)
      
      







これで、管理パネルにアクセスすると、ユーザーは記事のリストを表示し、記事のタグを変更できるようになります。また、記事のタイトルと内容も表示できますが、それらを変更することはできません。



別のニュアンス。 さまざまなモデルのオブジェクトへのアクセス権は、Permissionモデルのオブジェクトを介してJungに実装されます。 読み取りは1つの許可オブジェクトであり、書き込みは別の許可オブジェクトであり、別の許可オブジェクトは削除です。 manage.py syncdb



実行すると、新しいモデルの権限オブジェクトが作成されます。 プロキシモデルの作成時に、アプリケーションがsouthを介して制御されていた場合、Permissionオブジェクトは作成されず、southはプロキシモデルを「通知」せず、syncdb操作はsouthが提供するアプリケーションでは機能しません



プロキシモデルのpost_syncdb信号を送信する移行を作成する必要があります。



 class Migration(SchemaMigration): def forwards(self, orm): db.send_create_signal('myapp', ['ArticleEditProxy'])
      
      







このブログで移行ハックの詳細を学びました。



All Articles