1

「デフォルト」値を持つ整数フォーム フィールドが必要です。ただし、実行時にこの値を定義する必要があります。

私は次のようにします:

# at my form constructor:
def __init__(self, data=None, files=None, auto_id='id_%s', prefix=None, initial=None, error_class=ErrorList,
             label_suffix=':', empty_permitted=False):
    super(FlatSearchForm, self).__init__(data, files, auto_id, prefix, initial, error_class, label_suffix,
        empty_permitted)

    min_price = ... # some code to find the minimum price
    self.price_min = min_price # will be used later

    max_price = ... # some code to find the maximum price
    self.price_max = max_price

    # here we go:
    self.fields['price_from'] = forms.IntegerField(min_value=min_price, max_value=max_price, initial=min_price)
    self.fields['price_to'] = forms.IntegerField(min_value=min_price, max_value=max_price, initial=max_price)

# ...
# how I use the form (in views.py):
class SearchFlatView(ListView):
    model = Flat
    context_object_name = 'flats'
    template_name = 'catalog/search.html'

    def get_context_data(self, **kwargs):
        context = super(SearchFlatView, self).get_context_data(**kwargs)
        context['form'] = FlatSearchForm(self.request.GET)
        return context

問題は、{{form.price_from}} と {{form.price_to}} を使用してフィールドをレンダリングすると、フォームに値が表示されないことです。これらのフィールドは空です。

私が間違っていることを教えてください。

4

1 に答える 1

1

バインドされたフォームのフィールドに動的に初期値を設定することはできません。ドキュメントを参照してください: https://docs.djangoproject.com/en/dev/ref/forms/fields/#initial

初期引数を使用すると、このフィールドをバインドされていないフォームでレンダリングするときに使用する初期値を指定できます。

ただし、request.GET パラメータを保持したまま、バインドされていないフォームを作成することができます。

initial = request.GET.copy()
initial['price_from'] = some_min_price
initial['price_to'] = some_max_price
context['form'] = FlatSearchForm(initial=initial)

__iniit__ の形式では、次のようになります。

def __init__(self, *args, **kwargs):
    super(Form, self).__init__(*args, **kwargs)
    initial = kwargs.get("initial", {})
    default_min_value = ... #  some default value in case there is no `initial` passed
    default_max_value = ...
    self.fields['price_from'] = forms.IntegerField(min_value=initial.get('min_value', default_min_value), max_value=initial.get('max_value', default_max_value))
    self.fields['price_to'] = forms.IntegerField(min_value=initial.get('min_value', default_min_value), max_value=initial.get('max_value', default_max_value))

または、必要に応じてこのロジックを変更することもできます。

于 2012-07-13T09:00:02.217 に答える