Django で view から Form オブジェクトに値を渡す : kwargs活用
args, kwargs が良くわかってなかったので苦労した話。python2.7.x と Django1.8.xでの確認です。
Formオブジェクトに渡すときには
Formオブジェクトを生成するときに、GET パラメーターを渡したいと考えたが発端。あちこち参照して、一つに落ち着きました。
views.py:
class TestFormView(FormView): template_name = 'testform.html' form_class = TestForm success_url = reverse_lazy('index')
forms.py
class TestForm(forms.Form): name = forms.CharField(max_length=10) def __init__(self, *args, **kwargs): super(TestForm, self).__init__(*args, **kwargs)
kwargs で渡し、 pop で取得
これが一番だと思う。
views で こんな感じで渡して:
class TestFormView(FormView): def get_form_kwargs(self): kwargs = super(TagEditView, self).get_form_kwargs() kwargs['user'] = self.request.user return kwargs
Form で pop を使って受け取る:
class TestForm(forms.Form): def __init__(self, *args, **kwargs): self.user = kwargs.pop('user') super(TestForm, self).__init__(*args, **kwargs)
この方法だと pop した段階で kwargs から対象の値が削除されるので、その後の親クラス呼ぶときなどに気を使わなくてもいい。
FormViewに用意されてる get_form_kwargs という名称からもよろしげじゃないですかね?
forms.Model と forms.ModelForm の 違いって
Django でアプリ作ってて、ふと気になったのでまとめてみた。ざっくり、こんな感じ?
機能 | Model & Form | ModelForm |
---|---|---|
validation 指示 | Model & Form の両方で定義 | Model で定義 |
フォーム上の項目 | Form で定義 | Model の定義から、ModelForm が自動決定 *対応表 |
フォームで表示する項目 | Form で定義 | ModelForm で定義 |
save メソッド | Model.save() | ModelForm.save() (Model.save() も使える) |
DB の カラム以上のフィールドが不要なフォームでは、ModelForm を使うと断然コードが短く、簡潔になりますね。
ModelForm 利用時には、ModelForm の サブクラスに Meta クラスを作り、中に元になるModel (model = )や表示する項目 (fields =) に持たせることになります。Metaだけ持てば最低限OKになるので、Formの定義が超簡単!
また views.py の中でも、ModelForm が提供するものをメインで書けるようになり見通しがよくなります。
そもそものキッカケは、ManyToMany の 多対多 リレーションをはったModelに対するFormを上手く作る方法を知りたかったのです。Model & Form で頑張ってみたものの、ManyToMany になってるフィールドを上手く扱えず、ModelForm を利用した形で落ち着きました。なにが原因だったかは、また時間ができたら勉強しよう。
続きを読む"/usr/bin/ld: cannot find -lxslt" が出て pip で lxml がインストール出来ない問題を解消
長年の問題が解決した。。。(発覚してから1年ほどで、解決に使った時間は4時間超)
python パッケージは主に pip で管理しています。たまに苦労するのが gcc でコンパイルが必要なライブラリ。BeautifulSoupとセットで使いたい lxml もコンパイルが必要なライブラリなのですが、こいつでハマりました。
- Red Hat Enterprise Linux Server release 6.7 (Santiago), Linux kvml452 2.6.32-504.8.1.el6.x86_64
- gcc version 4.4.7 20120313 (Red Hat 4.4.7-17) , Target: x86_64-redhat-linux
- Python 2.7.8 (by SCL)
php シェルを使って簡単に検証
ちょっとしたコードの動作を確認したい場合に使えると思う。というか使った。
インタラクティブ Shell便利ー
$ man php
...
-a Run PHP interactively. This lets you enter snippets of PHP code that directly get executed. When readline sup-
port is enabled you can edit the lines and also have history support.
使い方の例
$ php -a
Interactive shellphp > print("Hello World");
Hello World
php > print(phpversion());
5.5.21
php > $imagickVersion = phpversion('imagick');
php > print($imagickVersion) ;
3.4.3RC1
php > exit
$