django-postimageを試してみた
Google Code巡礼をしているときに、django-postimageをみつけたので試してみた。
名前からもわかる通り、ファイルをsettings.pyで指定した"MEDIA_ROOT"以下にアップロードする機能を持っています。
さらに、サブディレクトリを作成することも出来ます。
まずはスクリーンショットから。
postimage-upload posted by (C)常山
"select uploaded"と"submit"ボタンの位置は愛嬌として、これがアップロード画面です。
"subdirectory"は入力しなくても、ファイルを指定してあればアップロードは可能です。
アップロード後の画面は
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 posted by (C)常山
もっとdjango-registrationやdjango-profilesなども参考にしてみよう :-)
パーミッションで割り当てられたモデルのみdatabrowseで表示する(問題あり)
まず、問題というのは
- アクセスしたユーザを取得するように出来ていないこと
- 根本的にアクセスしたユーザごとにdatabrowseの表示を動的に出来るのか
(PythonとDjangoの勉強も兼ねてということでもう少し続ける予定)
まずは、パーミッションで割り当てられたモデルのみ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()'と組み合わせてやるのがいいのかな?
どんな方法があるか調べる。