2012-07-13 23 views
1

我需要一个整数表单字段有一个'默认'值。但是我需要在运行时定义这个值。Django:动态IntegerField初始(呈现空)

我不喜欢它的部份:

# 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}} - 这些领域只是空的!

你能告诉我我做错了什么吗?

+0

你如何使用表格?你如何实例化它?它是绑定还是非绑定? – Tisho 2012-07-13 08:34:41

+0

更新了代码。一探究竟。 – 2012-07-13 08:40:49

回答

1

您无法为绑定形式的字段动态设置初始值。请参阅该文档:https://docs.djangoproject.com/en/dev/ref/forms/fields/#initial

初始参数让你指定的时候 未绑定的形式呈现本场使用的初始值。

什么,但是你可以做的是建立一个绑定形式,仍然保留PARAMS 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)) 

或者您可能需要更改此逻辑。