久しぶりにamazonに発注してしまった。
書籍、現物あり。
2時すぎにはコンビニからの入金が確認できたとさ。
さあ、いつ来ることやら。
ワクワクドキドキ。
これで遅ければ、ジュクドウさん、まだまだチャンスありまっせ。
P.S. 9/30.13時についた。
翌々日ですた。
2011年9月28日水曜日
2011年9月10日土曜日
formでselectを書き換え禁止
class Metaでwidgetsに適切なものを指定して、そのwidgetsが生成するhtml tagの属性をattrsに辞書で渡す。というわけやね。
追記:
class Hoge(ModelForm):True要らないけれど、attrsが辞書なので。
class Meta:
model = Foo
widgets = {'choice': forms.Select(attrs={'disabled': True,}),}
追記:
form = Hoge()でもOK
form.fields['choice'].widget.attrs['disabled'] = True
2011年9月6日火曜日
permission name取得
auth->groupでもいいけれど
python shell
>>> from django.contrib.auth.models import Permission
>>> for item in Permission.objects.all():
... print item.name
...
Can add log entry
...
て思っていたけれど。@permission_requiredが引くのはcodenameですた。
×... print item.name
○ ... print item.codename
それと、 permission_requiredで引けるのは、1個だけ。
でも複数のがほしいよな。add, change, delete単体でpermission与えるのより、全部与えるほうが多いような気がする。
えっ。作れって、そうさせて頂きます。
と思ったら。似たようなのがここにあった。
ということで、
python shell
>>> from django.contrib.auth.models import Permission
>>> for item in Permission.objects.all():
... print item.name
...
Can add log entry
...
て思っていたけれど。@permission_requiredが引くのはcodenameですた。
×... print item.name
○ ... print item.codename
それと、 permission_requiredで引けるのは、1個だけ。
でも複数のがほしいよな。add, change, delete単体でpermission与えるのより、全部与えるほうが多いような気がする。
えっ。作れって、そうさせて頂きます。
と思ったら。似たようなのがここにあった。
ということで、
#-*- coding:utf-8 -*-
from django.contrib.auth.decorators import user_passes_test
def require_all_permissions(perm_list):
"""
A decorator which checks user has all of the given permissions.
"""
def test_func(user):
return user.has_perms(perm_list)
return user_passes_test(test_func)どうでしょう。
django 初期のパーミッション
忘れないように初期のパーミッション
admin | log entry | Can add log entry
admin | log entry | Can change log entry
admin | log entry | Can delete log entry
auth | group | Can add group
auth | group | Can change group
auth | group | Can delete group
auth | message | Can add message
auth | message | Can change message
auth | message | Can delete message
auth | permission | Can add permission
auth | permission | Can change permission
auth | permission | Can delete permission
auth | user | Can add user
auth | user | Can change user
auth | user | Can delete user
contenttypes | content type | Can add content type
contenttypes | content type | Can change content type
contenttypes | content type | Can delete content type
sessions | session | Can add session
sessions | session | Can change session
sessions | session | Can delete session
sites | site | Can add site
sites | site | Can change site
sites | site | Can delete site
2011年9月5日月曜日
suckerfishでdropdownメニュー
ここから。
肝は、hoverしていないulを明後日の方に配置するということだけ。
hoverしたらulをもとの位置に戻す。
横メニューなら
肝は、hoverしていないulを明後日の方に配置するということだけ。
hoverしたらulをもとの位置に戻す。
横メニューなら
<html>に対して
<head>
<title>horizontal nav</title>
<meta charset="utf-8">
<link rel=stylesheet type="text/css" href="horizontalMenu.css">
</head>
<body>
<div id="menu">
<ul>
<li><a href="">test11</a></li>
<li>second
<ul>
<li><a href="">test21</a></li>
<li><a href="">test22</a></li>
<li>third
<ul>
<li><a href="">test31</a></li>
<li><a href="">test32</a></li>
<li><a href="">test33</a></li>
</ul>
</li>
<li><a href="">test23</a></li>
</ul>
</li>
<li><a href="">test12</a></li>
<li><a href="">test13</a></li>
</ul>
</div>
</body>
</html>
#menu ul{もしくは
margin: 0px;
padding: 0px;
list-style: none;
float: left;
}
#menu li{
margin: 0px;
padding: 0px;
border: 1px solid;
display: block;
color: black;
background-color: white;
display: block;
}
#menu li:hover{
color: white;
background-color: black;
}
#menu > ul > li{
float: left;
}
#menu ul > li > ul{
position: absolute;
left: -999em;
}
#menu ul > li:hover > ul{
left: auto;
}
#menu ul > li > ul > li{
width: 10em;
}
#menu ul > li > ul > li:hover > ul{
margin-top: -1.1em;
margin-left: 10em;
}
#menu ul{垂直メニューなら
margin: 0px;
padding: 0px;
list-style: none;
float: left;
}
#menu li{
margin: 0px;
padding: 0px;
border: 1px solid;
display: block;
color: black;
background-color: white;
display: block;
}
#menu li:hover{
color: white;
background-color: black;
}
#menu > ul > li{
float: left;
}
#menu ul > li > ul{
position: absolute;
display: none;
}
#menu ul > li:hover > ul{
display: block;
}
#menu ul > li > ul > li{
width: 10em;
}
#menu ul > li > ul > li:hover > ul{
margin-top: -1.1em;
margin-left: 10em;
}
#menu ul{もしくは
margin: 0px;
padding: 0px;
width: 10em;
list-style: none;
float: left;
}
#menu li{
margin: 0px;
padding: 0px;
width: 10em;
border: 1px solid;
position: relative;
float: left;
color: black;
background-color: white;
display: block;
}
#menu li:hover{
color: white;
background-color: black;
}
#menu li > ul{
margin-top: -1.3em;
margin-left: 10em;
position: absolute;
left: -999em;
}
#menu li:hover > ul{
left: auto;
}
#menu ul{
margin: 0px;
padding: 0px;
width: 10em;
list-style: none;
float: left;
}
#menu li{
margin: 0px;
padding: 0px;
width: 10em;
border: 1px solid;
position: relative;
float: left;
color: black;
background-color: white;
display: block;
}
#menu li:hover{
color: white;
background-color: black;
}
#menu li > ul{
margin-top: -1.3em;
margin-left: 10em;
position: absolute;
display: none;
}
#menu li:hover > ul{
display: block;
}
2011年9月3日土曜日
2011年8月11日木曜日
insert_at with commit arg @ django-cms 2.2 b1
やられた。
django-cms 2.2 b1から従来のdjango-cms内のmpttからdjango-mpttに変更になっている。
ここのDjango-cmsでpageをスクリプトで挿入する方法が"commit=True"から"save=True"に変更になっている。
django-cms 2.2 b1から従来のdjango-cms内のmpttからdjango-mpttに変更になっている。
ここのDjango-cmsでpageをスクリプトで挿入する方法が"commit=True"から"save=True"に変更になっている。
2011年8月4日木曜日
AdminSiteのソースを覗く
adminサイトをfancyにカスタマイズしたいので、とりあえずdjango.contrib.adminのsites.pyを覗いてみた。
class AdminSiteがデフォルトではdjango.contrib.admin.siteとしてインスタンス化される。
AdminSite.index_template
AdminSite.app_index_template
AdminSite.login_template
AdminSite.logout_template
AdminSite.password_change_template
AdminSite.password_change_done_template
にテンプレートをセット
modelのadminは
self._registry = {} # model_class class -> admin_class instance
に格納
AdminSite.index
が全体のモデルの一覧を表示
AdminSite.app_index
が各モデルを表示
documentsによるとこれを継承したクラスをつくれとのこと。
class AdminSiteがデフォルトではdjango.contrib.admin.siteとしてインスタンス化される。
AdminSite.index_template
AdminSite.app_index_template
AdminSite.login_template
AdminSite.logout_template
AdminSite.password_change_template
AdminSite.password_change_done_template
にテンプレートをセット
modelのadminは
self._registry = {} # model_class class -> admin_class instance
に格納
AdminSite.index
が全体のモデルの一覧を表示
AdminSite.app_index
が各モデルを表示
documentsによるとこれを継承したクラスをつくれとのこと。
admin template customize
置き場所は
TEMPLATE_DIRS
│
├admin
│ │
├app_name
│ │
│ ├model_name
│ │ │
│ │ ├customized_template_for_specific_models
│ │
│ ├customized_template_for_all_models
TEMPLATE_DIRS
│
├admin
│ │
├app_name
│ │
│ ├model_name
│ │ │
│ │ ├customized_template_for_specific_models
│ │
│ ├customized_template_for_all_models
2011年7月27日水曜日
BeautifulSoupのソースを読んでみた。 Read Write
上から順に舐めていくときは、findNext(), 下からならfindPrevious(),
同一レベルで順に舐めていくときは、findNextSibling(), 下からならfindPreviousSibling(),
複数形になるとそこを起点に全部
BeautifulSoupで読むのに必須なのはTagクラス。
でTagクラスには
findAll(self, name=None, attrs={}, recursive=True, text=None, limit=None, **kwargs)
基底クラスのPageElementには
findNext(self, name=None, attrs={}, text=None, **kwargs)
findAllNext(self, name=None, attrs={}, text=None, limit=None, **kwargs)
findPrevious(self, name=None, attrs={}, text=None, **kwargs)
findAllPrevious(self, name=None, attrs={}, text=None, limit=None, **kwargs)
findParent(self, name=None, attrs={}, **kwargs)
findParents(self, name=None, attrs={}, limit=None, **kwargs)
findNextSibling(self, name=None, attrs={}, text=None, **kwargs)
findNextSiblings(self, name=None, attrs={}, text=None, limit=None, **kwargs)
findPreviousSibling(self, name=None, attrs={}, text=None, **kwargs)
findPreviousSiblings(self, name=None, attrs={}, text=None, limit=None, **kwargs)
で、肝になる関数が
_findOne(self, method, name, attrs, text, **kwargs)
_findAll(self, name, attrs, text, limit, generator, **kwargs)
_findOneが1個_findAllが複数探してきてくれる。_findAllのgeneratorにnextGenerator, previousGenerator, nextSiblingGenerator, previousSiblingGeneratorを渡すことで舐める方向を決めている。
例
同一レベルで順に舐めていくときは、findNextSibling(), 下からならfindPreviousSibling(),
複数形になるとそこを起点に全部
BeautifulSoupで読むのに必須なのはTagクラス。
でTagクラスには
findAll(self, name=None, attrs={}, recursive=True, text=None, limit=None, **kwargs)
基底クラスのPageElementには
findNext(self, name=None, attrs={}, text=None, **kwargs)
findAllNext(self, name=None, attrs={}, text=None, limit=None, **kwargs)
findPrevious(self, name=None, attrs={}, text=None, **kwargs)
findAllPrevious(self, name=None, attrs={}, text=None, limit=None, **kwargs)
findParent(self, name=None, attrs={}, **kwargs)
findParents(self, name=None, attrs={}, limit=None, **kwargs)
findNextSibling(self, name=None, attrs={}, text=None, **kwargs)
findNextSiblings(self, name=None, attrs={}, text=None, limit=None, **kwargs)
findPreviousSibling(self, name=None, attrs={}, text=None, **kwargs)
findPreviousSiblings(self, name=None, attrs={}, text=None, limit=None, **kwargs)
で、肝になる関数が
_findOne(self, method, name, attrs, text, **kwargs)
_findAll(self, name, attrs, text, limit, generator, **kwargs)
_findOneが1個_findAllが複数探してきてくれる。_findAllのgeneratorにnextGenerator, previousGenerator, nextSiblingGenerator, previousSiblingGeneratorを渡すことで舐める方向を決めている。
例
<html>example
<head>
<title>
Page title
</title>
</head>
<body>
<p id="firstpara" align="center">
This is paragraph one.
</p>
<p id="secondpara" align="blah">
This is paragraph two.
</p>
<div>
first level
<div>
second level
<div>
third level
</div>
</div>
</div>
</body>
</html>
#!/usr/bin/env python
#-*- coding:utf-8 -*-
from BeautifulSoup import BeautifulSoup
fi = open(u'test.html', u'r')
soup = BeautifulSoup(''.join(fi.read()))
print u'### document'
print u'tag name: ', soup.name
html = soup.html
print u'### top html'
print u'tag name: ', html.name
# findNext
head = html.findNext()
print u'### findNext @ html'
print u'tag name: ', head.name
title = head.findNext()
print u'### findNext @ head'
print u'tag name: ', title.name
body = title.findNext()
print u'### findNext @ title'
print u'tag name: ', body.name
# findPrevious
current = body.findPrevious()
print u'### findPrevious @ body'
print u'tag name: ', current.name
current = current.findPrevious()
print u'### findPrevious @ title'
print u'tag name: ', current.name
current = current.findPrevious()
print u'### findPrevious @ head'
print u'tag name: ', current.name
# findAllNext
current = body.findAllNext()
print u'### findAllNext @ body'
for item in current:
print u'tag name: ', item.name
# findAllPrevious
current = body.findAllPrevious()
print u'### findAllPrevious @ body'
for item in current:
print u'tag name: ', item.name
# findParent
current = body.findParent()
print u'### findParent @ body'
print u'tag name: ', current.name
current = title.findParent()
print u'### findParent @ title'
print u'tag name: ', current.name
# findParents
current = body.findParents()
print u'### findParents @ title'
print u'from tag name: ', body.name
for item in current:
print u'tag name: ', item.name
bottom = body.div.div.div
print u'### findParents @ bottom of div'
print u'from tag name: ', bottom.name
current = bottom.findParents()
for item in current:
print u'tag name: ', item.name
# findNextSibling
p = body.findNext()
print u'### findNextSibling @ body.p'
print u'from tag name: ', p.name
print p.text
current = p.findNextSibling()
print u'tag name: ', current.name
print current.text
# findNextSiblings
p = body.findNext()
print u'### findNextSiblings @ body.p'
print u'from tag name: ', p.name
print p.text
current = p.findNextSiblings()
print current
for item in current:
print u'tag name: ', item.name
# findPreviousSibling
current = body.div
print u'### findPreviousSibling @ body.div'
print u'from tag name: ', current.name
current = current.findPreviousSibling()
print u'tag name: ', current.name
print current.text
# findPreviousSiblings
current = body.div
print u'### findPreviousSiblings @ body.div'
print u'from tag name: ', current.name
current = current.findPreviousSiblings()
print current
for item in current:
print u'tag name: ', item.name
print u'tag text: ', item.text
2011年7月26日火曜日
UQ Wimaxが遅い
先日、Try WiMAX レンタルで借りてみた。
朝や夜間はそこそこの速度が出るのだが昼間はダメ、比較にならないほど遅くなる。ちょっとしたファイルのダウンロードやアップロードでもウンともスンとも言わなくなるし、webサイトはリロードを頻繁に繰り返さないと取ってこない。
tracerouteで調べたら、Wimax, KDDIの内部で1,000msec以上かかっているじゃああーーりませんか。朝や夜間は100msec程度。こりゃダメだ。使いもんにならない。基地局の設置ばっかり頑張っていてもナローバンド回線では。
ここの提供パターン3,4,5あたりでMVNOでやっているところなら大丈夫なのだろうか?
結論:固定回線の代替にはなりません。
追記:2chあたりでは 上記のMVNOのほうが遅いとか言っている。これより遅いのか?
朝や夜間はそこそこの速度が出るのだが昼間はダメ、比較にならないほど遅くなる。ちょっとしたファイルのダウンロードやアップロードでもウンともスンとも言わなくなるし、webサイトはリロードを頻繁に繰り返さないと取ってこない。
tracerouteで調べたら、Wimax, KDDIの内部で1,000msec以上かかっているじゃああーーりませんか。朝や夜間は100msec程度。こりゃダメだ。使いもんにならない。基地局の設置ばっかり頑張っていてもナローバンド回線では。
ここの提供パターン3,4,5あたりでMVNOでやっているところなら大丈夫なのだろうか?
結論:固定回線の代替にはなりません。
追記:2chあたりでは 上記のMVNOのほうが遅いとか言っている。これより遅いのか?
2011年7月25日月曜日
登録:
投稿 (Atom)

