"Spass mit Newforms-Admin - Rowlevel-Permissions"超絶意訳

Spass mit Newforms-Admin - Rowlevel-Permissionsを試してみた。
これをマスターするとAdmin Interfaceでのデーター表示を制御できるようになれるので、
Admin-interfaceを有効的に使いたい人は是非試してみてください。


Djangoのリビジョンは8520で試しています。
今回は初期設定を省いて、アプリを編集することから始めます。
プロジェクト名は"myproject"、アプリ名は"weblog"と参考にしたBlogにあわせています。


まずはmodels.pyを編集します。

from django.db import models
from django.contrib.auth.models import User

# Create your models here.

class Entry(models.Model):
    title = models.CharField(max_length=255)
    content = models.TexField()
    author = models.ForeignKey(User)
    
    def __unicode__(self):
        return self.title

保存して

manage.py syncdb

を実行します。
次にweblogディレクトリにadmin.pyを作成して以下のように編集します。

from django.contrib import admin
from myproject.weblog.models import Entry

class EntryAdmin(admin.ModelAdmin):
    list_display = (
        'title',
        'author',
    )

admin.site.register(Entry, EntryAdmin)

次に開発サーバーを起動してAdmin-interfaceからデーターを入力してください。
全Entryデーターが表示されています。
これをログインしたユーザーのデーターのみ表示させるにはadmin.pyを更に編集します。

from django.contrib import admin
from myproject.weblog.models import Entry

class EntryAdmin(admin.ModelAdmin):
    def queryset(self, request):
        return self.model._default_manager.filter(author=request.user)
    
    list_display = (
        'title',
        'author',
    )

admin.site.register(Entry, EntryAdmin)

Admin-interfaceにアクセスしてみてください。
このように現在ログインしたユーザーのデーターのみ表示されていると思います。


これで終わらせてもいいのですが、一つ問題があります。
このままだと、全データーを見ることが出来るユーザーパーミッションがありません。
全データーを見ることが出来るユーザーパーミッションを作成するにはまずmodels.pyを編集します。

from django.db import models
from django.contrib.auth.models import User

# Create your models here.

class Entry(models.Model):
    title = models.CharField(max_length=255)
    content = models.TextField()
    author = models.ForeignKey(User)
    
    class Meta:
        permissions = (
            ('can_view_all', 'Can view all Entries'),
        )
        
    def __unicode__(self):
        return self.title

編集し、保存した後必ず

manage.py syncdb

を実行してください。
コンソールにはなにも表示されませんが"auth_permission"のテーブルに設定したデーターが入ります。
この状態でユーザーパーミッションを確認してください。
"weblog | entry | Can view all entries"が追加されています。
そしてユーザーパーミッションを設定してください。
しかし、このままでは機能しません。
もう少しコーディングします。
admin.pyを編集します。

from django.contrib import admin
from myproject.weblog.models import Entry

class EntryAdmin(admin.ModelAdmin):
    def queryset(self, request):
        if request.user.has_perm('weblog.can_view_all'):
            return self.model._default_manager.get_query_set()
        return self.model._default_manager.filter(author=request.user)
    
    list_display = (
        'title',
        'author',
    )

admin.site.register(Entry, EntryAdmin)

これで"weblog | entry | Can view all entries"のユーザーパーミッション
持っているユーザーは全てのデーターを表示することが出来ます。


これでAdmin-interfaceをさらに活用できます :-)