DjangoでURLのGETパラメータをModelFormの初期値にする

Django
スポンサーリンク
language
スポンサーリンク

やりたいこと

ModelFormで表示しているフォームにURLのGETパラメータを初期値として表示したい

サンプルコード

viewからformに渡す

CreateViewを継承したクラスでModelFormにデータを渡すにはget_form_kwargsを使います。

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.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>

タイトルとURLをコピーしました