verbose_name をモデルクラスから直接取り出したければ、 _meta を参照するしか
方法はないと思います。ただし、verbose_name に限って言えば、
django.contrib.contenttypes.ContentType.name を使えば verbose_name を得られます::
from django.contrib.contenttypes.models import ContentType
from yourapp.models import YourModel
...
def yourview(request):
ct = ContentType.objects.get_for_model(YourModel)
...
return HttpResponse(Template('{% load i18n %}{% trans ct.name %}').render(Context(dict(ct=ct))))
翻訳前の値なので、明示的に翻訳が必要です。
---
Yasushi Masuda
http://ymasuda.jp/
Sumiya Sakoda さんは書きました:
翻訳を使わなければならないとか、 ascii でなければならない、といった
流儀はなかったように思います。挙動をみるかぎり、パーミッションのテーブルから
レコードを取り出そうとしてエラーを起こしているようですね。
お使いのバックエンドのレベルで (manage.py shell/dbshell で) パーミッション
テーブルを select できますか?あと、実際のコードでは verbose_name を unicode
リテラルでマークアップしていますでしょうか?
---
Yasushi Masuda
http://ymasuda.jp/
Sumiya Sakoda さんは書きました:
いい機会だったので、ちょっと mysql を入れて調べてみました。 u'商品' でうまく動きました。
(デフォルトのインストールで character set が latin1 に設定されてうまくいかなかったので
my.cnf で utf8 に設定しました。)
### テーブルを作成します。
herring:demo1 ymasuda$ /usr/local/mysql/bin/mysqladmin create demo20080922
### 文字セットは utf8 です。
herring:demo1 ymasuda$ /usr/local/mysql/bin/mysql
...
mysql> \s demo20080922
--------------
/usr/local/mysql/bin/mysql Ver 14.12 Distrib 5.0.67, for apple-darwin9.0.0b5 (i686) using readline 5.1
Connection id: 155
Current database:
Current user: ymasuda@localhost
SSL: Not in use
Current pager: stdout
Using outfile: ''
Using delimiter: ;
Server version: 5.0.67 MySQL Community Server (GPL)
Protocol version: 10
Connection: Localhost via UNIX socket
Server characterset: utf8
Db characterset: utf8
Client characterset: utf8
Conn. characterset: utf8
UNIX socket: /tmp/mysql.sock
Uptime: 5 min 1 sec
...
-> \q
Bye
### syncdb でテーブルを生成します。
herring:demo1 ymasuda$ ./manage.py syncdb
Creating table auth_permission
...
Creating table s_item
...
Installing index for auth.Permission model
...
### dbshell で確認すると、 s_item モデルテーブルができています。
herring:demo1 ymasuda$ ./manage.py dbshell
...
mysql> show tables;
+----------------------------+
| Tables_in_demo20080922 |
+----------------------------+
...
| s_item |
+----------------------------+
12 rows in set (0.00 sec)
### パーミッションテーブルのレコードを問題なく取り出せます。
mysql> select * from auth_permission;
+----+-------------------------+-----------------+--------------------+
| id | name | content_type_id | codename |
+----+-------------------------+-----------------+--------------------+
...
| 25 | Can add 商品 | 9 | add_item |
| 26 | Can change 商品 | 9 | change_item |
| 27 | Can delete 商品 | 9 | delete_item |
+----+-------------------------+-----------------+--------------------+
27 rows in set (0.00 sec)
mysql> \q
Bye
### shell を起動して Permission オブジェクトを取り出してみます。
herring:demo1 ymasuda$ ./manage.py shell
...
In [1]: from django.contrib.auth.models import *
In [2]: Permission.objects.all()
Out[2]: [<... <Permission: s | 商品 | Can add 商品>, <Permission: s | 商品 | Can change 商品>, <Permission: s | 商品 | Can delete 商品>, ...]
...
In [5]: Permission.objects.all()[19]
Out[5]: <Permission: s | 商品 | Can change 商品>
In [6]: Permission.objects.all()[19].name
Out[6]: u'Can change \u5546\u54c1'
...
### コンテンツタイプの verbose_name を取り出します。
In [11]: Permission.objects.all()[19].content_type.name
Out[11]: u'\u5546\u54c1'
In [12]: print Permission.objects.all()[19].content_type.name
商品
(この時点で、 http://localhost:8000/admin/auth/user/add/ でユーザを
追加した **後**, パーミッションを操作できます)
Python の文字コードというよりも、 MySQL とか MySQLdb の問題で
エラーを引き起こしているのかもしれません。
手元の MySQLdb のバージョンは 1.2.2 です。DATABASE_OPTIONSは使っていません。
---
Yasushi Masuda
http://ymasuda.jp/
Sumiya Sakoda さんは書きました: