django-postimageを試してみた

Google Code巡礼をしているときに、django-postimageをみつけたので試してみた。
名前からもわかる通り、ファイルをsettings.pyで指定した"MEDIA_ROOT"以下にアップロードする機能を持っています。
さらに、サブディレクトリを作成することも出来ます。
まずはスクリーンショットから。


postimage-upload
postimage-upload posted by (C)常山
"select uploaded"と"submit"ボタンの位置は愛嬌として、これがアップロード画面です。
"subdirectory"は入力しなくても、ファイルを指定してあればアップロードは可能です。


アップロード後の画面は
postimage-attach
postimage-attach posted by (C)常山
となっています。
"upload new"と"submit"ボタンも愛嬌で:-)

テンプレートは、"{% extends "admin/postimage/base.html" %}"としているため
adminに組み込むことも容易だと思います。


django-postimageをベースにし、Admin Interfaceに組み込めば、印刷会社などの認証付きの原稿アップロード管理サイトが簡単に出来るかなぁ?


いろいろ試してみます:-)

新Admin Interface(・∀・)イイ!

現在、メール投稿を中心としたBlogを作ろうかと思ってます。
今日は、アカウントの部分を作ってみた。
本来なら、django.contrib.auth.models.Userを使って管理すればいいのですが

  • ハンドルネームをユーザ名とは別の名前にしたい。
  • 携帯・PCなど複数のメールアドレスから投稿したい。

などから今回はdjango.contrib.auth.models.Userを拡張します。


models.py

#-*- encoding:utf-8 -*-
from django.db import models
from django.contrib.auth.models import User

class Nickname(models.Model):
    user = models.ForeignKey(User)
    nickname = models.CharField(max_length=10)
    
    def __unicode__(self):
        return self.nickname
    
    def save(self):
        if not self.id:
            super(Nickname, self).save()

class Allowlist(models.Model):
    author = models.ForeignKey(Nickname)
    email = models.EmailField(unique=True)
    
    def __unicode__(self):
        return "%s (%s)" % (self.email, self.author)
    
    def save(self):
        if not self.id:
            super(Allowlist, self).save()

admin.py

#-*- encoding:utf-8 -*-

from django.contrib import admin
from accounts.models import *

class Email_Inline(admin.StackedInline):
    model = Allowlist
    extra = 2

class NicknameOption(admin.ModelAdmin):
    ordering = ['nickname',]
    inlines = [Email_Inline, ]

admin.site.register(Nickname, NicknameOption)

約40行くらい(設定等の部分は抜きますが)コーディングするだけで
以下のようなフォームを自動生成します!
以前のAdmin Interfaceではやる気は起きなかったな。うーん便利 ;-)
admininterface
admininterface posted by (C)常山


もっとdjango-registrationdjango-profilesなども参考にしてみよう :-)

パーミッションで割り当てられたモデルのみdatabrowseで表示する(問題あり)

まず、問題というのは

  • アクセスしたユーザを取得するように出来ていないこと
  • 根本的にアクセスしたユーザごとにdatabrowseの表示を動的に出来るのか

(PythonDjangoの勉強も兼ねてということでもう少し続ける予定)


まずは、パーミッションで割り当てられたモデルのみdatabrowseに登録

from django.db.models import get_model
from django.contrib.auth.models import User
from django.contrib.contenttypes.models import ContentType
from django.contrib import databrowse

#固定ではなくアクセスしたユーザごとに取得できるようにする
user = User.objects.get(username = 'test')

id = []

#content_type_id取得
for dic in user.user_permissions.values():
	id.append(dic.get('content_type_id'))

#content_type_idをuniqueにする
i = set(id)
id = list(i)

#content_type_idから'app_label', 'model'を取得しdatabrowseに登録する
for cid in id:
	content = ContentType.objects.get(pk = cid)
	app_label = content.app_label
	model = content.model
	
	databrowse.site.register(get_model(app_label, model))

あと、修正しなければいけないところは

  • 'content_type_id'をuniqueにするのにset関数を使わない
  • もう少しスマートなコーディングが出来るのでは?

ということで、Django Snippetsで調べると解決策が見つかるかな?
調べるか:)

ユーザ名から、許可されているパーミッションのモデルを取得する2

前回の内容を引き続き。


freecommentにあった'content_type_id'から'app_label','model'を取得

>>> from django.contrib.contenttypes.models import ContentType
>>> c = ContentType.objects.filter(pk=16)
>>> c.values()

結果は

{'model': u'cat', 'app_label': u'cat', 'id': 16, 'name': u'cat'}

'app_label'と'model'からなんとか出来ないかなぁ。
'get_models()'と組み合わせてやるのがいいのかな?


どんな方法があるか調べる。