しかし、ユーザーがフィールドの一部のみを編集できるようにしたい場合はどうでしょうか? 同時に、他のユーザーがすべてのフィールドを編集できるようにしてください。
プロキシモデルが役立ちます。 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'])
このブログで移行ハックの詳細を学びました。