目次
やりたいこと
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 kwargsModelFormで初期値に設定
ModelFormではinitで初期値を入れます。
viewで渡したself.requestは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>
 
	






コメント