2011-02-16 89 views
0

我有一個整數字段,但它們的默認小部件是TextInput。我想使用Select小部件,但我必須明確提供可能的值。Django自定義字段或小部件?

是否有可能從'initial', 'min_value' and 'max_value'驗證規則integer!字段自動生成?

我是否必須創建自己的字段,窗口小部件或兩者兼有?如何?

回答

2

你可以用__init__的方式來做。

def MyForm(forms.Form): 
    my_integer = forms.IntegerField(min_value=0, max_value=10, widget=forms.Select) 

    def __init__(self, *args, **kwargs): 
     super(MyForm, self).__init__(*args, **kwargs) 
     my_int = self.fields['my_integer'] 
     my_int.choices = [(i, i) for i in range(my_int.min_value, my_int.max_value)] 
+0

你肯定my_int.choices = ...是設置值正確的地方,因爲對我來說這沒」工作。我只設法使用widget = forms.Select(選擇= ...) – 2011-02-16 10:42:05

1

這是怎麼了,我一般做特殊選擇:

def MyForm(forms.Form): 
    INTEGER_CHOICES = [(i, i) for i in range(MIN_VALUE, MAX_VALUE)] 
    my_integer = forms.ChoiceField(choices=INTEGER_CHOICES) 

而不是反省我只是把最大值和最小值的變量在頂部簡單的模型字段。

而不是使用IntegerField,我使用ChoiceField。詳情請查看ChoiceField documentation。他們並不難用。

1

您可以定義字段在窗體的初始化方法,像這樣:

def __init__(self, *args, **kwargs): 
    super(MyForm, self).__init__(*args, **kwargs) 
    initial = 40 
    min_value = 10 
    max_value = 100 

    self.fields['the_field'] = forms.ChoiceField(choices=range(min_value, max_value + 1), initial=initial, validators=[MinValueValidator(min_value), MaxValueValidator(max_value)])