目次
やりたいこと
ModelForm
で表示しているフォームにURLのGETパラメータを初期値として表示したい
サンプルコード
viewからformに渡す
CreateView
を継承したクラスでModelForm
にデータを渡すにはget_form_kwargs
を使います。
ここではGETパラメータを含むself.request
をフォームに渡します。
from django.views import generic
from apps.products.forms import ProductForm
from apps.products.models import Product
class ProductCreateView(generic.CreateView):
""" 商品新規登録 """
model = Product
form_class = ProductForm
template_name = "products/add.html"
raise_exception = True # 403ページの表示
def get_form_kwargs(self):
kwargs = super( TransactionCreateView, self).get_form_kwargs()
if self.request.method=="GET":
kwargs.update(self.request) # self.request をProductFormに渡す
# kwargs.update(self.kwargs) # self.kwargs はURLパラメータの設定を含みます。
return kwargs
ModelFormで初期値に設定
ModelForm
ではinit
で初期値を入れます。
viewで渡したself.reques
tはkwargs
に入っています。
from django import forms
from apps.products.models import Product
class ProductForm(forms.ModelForm):
class Meta:
model = Product
fields = ('title', 'price', 'memo' )
# __init__上でフィールドを初期化します
def __init__(self, *args, **kwargs):
self.request = kwargs.pop("request")
super(ProductForm, self).__init__(*args, **kwargs)
self.fields['title'].initial = self.request.GET.get('title', 'デフォルトの商品名')
self.fields['memo'].initial = self.request.GET.get('memo', 'デフォルトのメモ')
templateにフォームを表示
ProductForm
で初期値を入れているので、テンプレートではフォームを表示するだけです。
<form action="{% url 'products:add' %}" method="post">
{% csrf_token %}
{% form layout='horizontal' %}
<button type="submit" class="btn btn-raised btn-success">取引を登録</button>
</form>
コメント