あんまりアホなことすると、とんでもないエラーを吐いたので記録。
Exception Type: TypeError
Exception Value: __init__() takes exactly 1 argument (2 given)
ってわかりませんですがな。
実は、
FooGenericView.as_view()
の後ろが抜けていただけ。orz
2012年4月6日金曜日
2012年4月4日水曜日
Django否定のfilter
こいつ気に入らないから、除いてなんてことあるよね。(ウソ)
from django.contrib.auth.models import User
from django.db.models import Q
User.objects.filter(~Q(id=1))
from django.contrib.auth.models import User
from django.db.models import Q
User.objects.filter(~Q(id=1))
2012年1月24日火曜日
HttpResponseRedirectにcontextを渡す。
あるページにリダイレクトして、リダイレクト元のページに戻るれるようボタンを表示したい。
request.session['send_page'] = reverse('send_page')
return HttpResponseRedirect(u'page_send_to')
リダイレクト先のテンプレートで
{% if request.session.send_paget %}
<a href="{{ request.session.send_page }}"><img src="{{ MEDIA_URL }}path2img/back.png" alt="Back to Tree" /></a>
{% endif %}
request.session['send_page'] = reverse('send_page')
return HttpResponseRedirect(u'page_send_to')
リダイレクト先のテンプレートで
{% if request.session.send_paget %}
<a href="{{ request.session.send_page }}"><img src="{{ MEDIA_URL }}path2img/back.png" alt="Back to Tree" /></a>
{% endif %}
2012年1月23日月曜日
DjangoでformのForeignKey選択設定
Djangoでmodelを与えてformを作成すると、勝手にForeignKeyはselectionをoptionで用意してくれる
tutorialの
tutorialの
class Choice(models.Model): poll = models.ForeignKey(Poll) choice = models.CharField(max_length=200) votes = models.IntegerField()
なら、pollはclass Select(Widget)でoptionに選択可能なqueryの結果が表示される。
でもここではその中でも特定の要素を持つものに絞りたい。
form.fields['poll'].queryset = Poll.objects.filter(hoge=fuga)
さらに、特定の値をデフォルトにするには、
form.fields['poll'].initial = Poll.objects.get(pk=fuga)
2011年10月22日土曜日
2011年10月21日金曜日
pythonでcoreserverからmail送信
chihiroさんのこのページのほぼ丸写し。
chihiroさんありがとうございます。
chihiroさんありがとうございます。
# -*- coding: utf-8 -*-違いは赤い字のSMTP_SSLあたり
import smtplib
from email.MIMEText import MIMEText
from email.Utils import formatdate
from pit import Pit
def create_message(from_addr, to_addr, subject, body):
msg = MIMEText(body)
msg['Subject'] = subject
msg['From'] = from_addr
msg['To'] = to_addr
msg['Date'] = formatdate()
return msg
def send_via_SSL(from_addr, to_addr, msg, email_account):
print from_addr + ' to ' + to_addr
mail_pit = Pit.get(email_account)
s = smtplib.SMTP_SSL(mail_pit['servername'], 465) #
s.ehlo()
s.login(mail_pit['username'], mail_pit['password'])
s.sendmail(from_addr, [to_addr], msg.as_string())
s.close()
if __name__ == '__main__':
from_addr = 'hoge@hogehoge.jp'
to_addr = 'hoge@hogehoge.com'
email_account = 'hoge@hogehoge.jp'
msg = create_message(from_addr, to_addr, 'test subject', from_addr + ' to ' + to_addr + ' using ' + email_account + ' with SSL')
send_via_SSL(from_addr, to_addr, msg, email_account)
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年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年6月23日木曜日
djangoでlocalとremoteを切り替える。tips
djangoで共有SSLを使っていると、remoteとlocalを切り替えるのが面倒だ。
settingsに
USE_AT_LOCAL = False
を追加して、
manage.pyに
settings.USE_AT_LOCAL = True
を追加して、
remoteとlocalの部分をifで切り分けた。
eclipseでdebugできるぞ。
settingsに
USE_AT_LOCAL = False
を追加して、
manage.pyに
settings.USE_AT_LOCAL = True
を追加して、
remoteとlocalの部分をifで切り分けた。
eclipseでdebugできるぞ。
2011年6月2日木曜日
2011年5月17日火曜日
Django password reset
NoReverseMatch: Reverse for 'yourapp.django.contrib.auth.views.password_reset_confirm' with arguments '()' and keyword argumentsとでたら、ここ
2011年5月16日月曜日
2011年4月8日金曜日
python-dateutil
'No module named _thread'と出たら、ここからpython-dateutilを取り込み、インストール。
pipでインストールすると上が出る。
python-dateutil-2.0.tar.gz (Python >= 3.0)
python-dateutil-1.5.tar.gz (Python < 3.0)
pipでインストールすると上が出る。
python-dateutil-2.0.tar.gz (Python >= 3.0)
python-dateutil-1.5.tar.gz (Python < 3.0)
2011年2月18日金曜日
既存の関数に後からデコレート
django-axesでやっていたのでメモ
admin.site.loginに定義したwatch_loginをくっつける。middlewareの初期化でやっちゃう。
admin.site.loginに定義したwatch_loginをくっつける。middlewareの初期化でやっちゃう。
class FailedLoginMiddleware(object):
def __init__(self, *args, **kwargs):
super(FailedLoginMiddleware, self).__init__(*args, **kwargs)
# watch the admin login page
admin.site.login = watch_login(admin.site.login)
# and the regular auth login page
auth_views.login = watch_login(auth_views.login)
Djangoのadminのurlsは
django.admin.site.urls -> django.admin.site.get_urls
urlpatterns = patterns('',
url(r'^$', wrap(self.index), name='index'),
url(r'^logout/$', wrap(self.logout), name='logout'),
url(r'^password_change/$', wrap(self.password_change, cacheable=True), name='password_change'),
url(r'^password_change/done/$', wrap(self.password_change_done, cacheable=True), name='password_change_done'),
url(r'^jsi18n/$', wrap(self.i18n_javascript, cacheable=True), name='jsi18n'),
url(r'^r/(?P<content_type_id>\d+)/(?P<object_id>.+)/$', 'django.views.defaults.shortcut'),
url(r'^(?P<app_label>\w+)/$', wrap(self.app_index), name='app_list')
)
urlpatterns += patterns('',
url(r'^%s/%s/' % (model._meta.app_label, model._meta.module_name), include(model_admin.urls))
)
2011年2月8日火曜日
django-axesでlogin lock
djangoでadminやloginに複数回のログイン失敗に対してlockをかけ設定した時間が経過しないとログインできないようにしたいならdjango-axes
ドキュメントとおりにインストールしてdjangoに設定すればOK
ソース読めば分かるけれど、ドキュメントにない設定もある。使うのは、
#失敗した後ロックされる時間
AXES_COOLOFF_TIME = 3 #hour
#ロックされたときに使うテンプレート
AXES_LOCKOUT_TEMPLATE = 'account_locked.html'
あと、
settings.pyで
PROJECT_ROOT = os.path.abspath(os.path.dirname(__file__))
と設定しているから
LOGFILE = os.path.join(settings.DIRNAME, 'axes.log')
を
LOGFILE = os.path.join(settings.PROJECT_ROOT, 'axes.log')
としてプロジェクトディレクトリにlogin履歴がaxes.logに書き込まれる。
AXES_LOCKOUT_TEMPLATEには
'cooloff_time': COOLOFF_TIME,
'failure_limit': FAILURE_LIMIT,
が渡されるので好きにしてよい。
デコレーターなので自前のログイン関数にも
from axes.decorators import watch_login
.......
@watch_login
def login(request):
でOK
本家はここ。 TNX!
ドキュメントとおりにインストールしてdjangoに設定すればOK
ソース読めば分かるけれど、ドキュメントにない設定もある。使うのは、
#失敗した後ロックされる時間
AXES_COOLOFF_TIME = 3 #hour
#ロックされたときに使うテンプレート
AXES_LOCKOUT_TEMPLATE = 'account_locked.html'
あと、
settings.pyで
PROJECT_ROOT = os.path.abspath(os.path.dirname(__file__))
と設定しているから
LOGFILE = os.path.join(settings.DIRNAME, 'axes.log')
を
LOGFILE = os.path.join(settings.PROJECT_ROOT, 'axes.log')
としてプロジェクトディレクトリにlogin履歴がaxes.logに書き込まれる。
AXES_LOCKOUT_TEMPLATEには
'cooloff_time': COOLOFF_TIME,
'failure_limit': FAILURE_LIMIT,
が渡されるので好きにしてよい。
デコレーターなので自前のログイン関数にも
from axes.decorators import watch_login
.......
@watch_login
def login(request):
でOK
本家はここ。 TNX!
2011年1月12日水曜日
共有SSLでDjango接続
proxyを使って
https http
client---------->SSL(proxy) Server--------->Server
|----> provider
と言うことらしい。
つまり、プロバイダ内のSSLサーバーがSSL接続を受けて、プロバイダ内のネットワークを経由して共有サーバーに普通にhttp接続する。こうすることにより、clientからプロバイダまでの接続が暗号化される。
coreserverだと
request.METAの中に'HTTP_VIA'と'HTTP_X_FORWARDED_FOR'がセットされている。
ちゅうことは、Djangoのミドルウエアで受けたらOKかな?
参考:
http://drupal.org/node/339552
http://wiki.ryusendo.net/index.cgi?page=PHP%A5%D7%A5%ED%A5%B0%A5%E9%A5%DF%A5%F3%A5%B0#p17
追記:
HTTP_X_FORWARDED_FORがセットされたrequestがくるとurlを変更するミドルウエアでOK
のこるはlogin, admin
https http
client---------->SSL(proxy) Server--------->Server
|----> provider
と言うことらしい。
つまり、プロバイダ内のSSLサーバーがSSL接続を受けて、プロバイダ内のネットワークを経由して共有サーバーに普通にhttp接続する。こうすることにより、clientからプロバイダまでの接続が暗号化される。
coreserverだと
request.METAの中に'HTTP_VIA'と'HTTP_X_FORWARDED_FOR'がセットされている。
ちゅうことは、Djangoのミドルウエアで受けたらOKかな?
参考:
http://drupal.org/node/339552
http://wiki.ryusendo.net/index.cgi?page=PHP%A5%D7%A5%ED%A5%B0%A5%E9%A5%DF%A5%F3%A5%B0#p17
追記:
HTTP_X_FORWARDED_FORがセットされたrequestがくるとurlを変更するミドルウエアでOK
のこるはlogin, admin
登録:
投稿 (Atom)