ラベル Django の投稿を表示しています。 すべての投稿を表示
ラベル Django の投稿を表示しています。 すべての投稿を表示

2012年4月6日金曜日

generic viewでerror

あんまりアホなことすると、とんでもないエラーを吐いたので記録。

Exception Type:     TypeError
Exception Value:     __init__() takes exactly 1 argument (2 given)

ってわかりませんですがな。
実は、
FooGenericView.as_view()
の後ろが抜けていただけ。orz

2012年4月4日水曜日

Django否定のfilter

こいつ気に入らないから、除いてなんてことあるよね。(ウソ)

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 %}

2012年1月23日月曜日

DjangoでformのForeignKey選択設定

Djangoでmodelを与えてformを作成すると、勝手にForeignKeyはselectionをoptionで用意してくれる
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日土曜日

djangoでmail送信

サーバーが吸い込んでいるのに送信されないとか、届いたメールの送信元がおかしいときはsettings.pyの
DEFAULT_FROM_EMAIL
を疑おう。

2011年10月21日金曜日

pythonでcoreserverからmail送信

chihiroさんのこのページのほぼ丸写し。
chihiroさんありがとうございます。
# -*- coding: utf-8 -*-

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)
 違いは赤い字のSMTP_SSLあたり

2011年9月10日土曜日

formでselectを書き換え禁止

class Metaでwidgetsに適切なものを指定して、そのwidgetsが生成するhtml tagの属性をattrsに辞書で渡す。というわけやね。

class Hoge(ModelForm):

    class Meta:
        model = Foo
        widgets = {'choice': forms.Select(attrs={'disabled': True,}),}
True要らないけれど、attrsが辞書なので。

追記:
form = Hoge()

form.fields['choice'].widget.attrs['disabled'] = True
でもOK

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与えるのより、全部与えるほうが多いような気がする。
えっ。作れって、そうさせて頂きます。

と思ったら。似たようなのがここにあった。

ということで、
#-*- 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によるとこれを継承したクラスをつくれとのこと。

admin template customize

置き場所は
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できるぞ。

2011年6月2日木曜日

djangoでdumpdata

./manage.py dumpdata --indent 2
とするとインデント付きでダンプしてくれる。

2011年5月17日火曜日

Django password reset

NoReverseMatch: Reverse for 'yourapp.django.contrib.auth.views.password_reset_confirm' with arguments '()' and keyword argumentsとでたら、ここ

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)

2011年2月18日金曜日

既存の関数に後からデコレート

django-axesでやっていたのでメモ
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!

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